Мутабельные аргументы по умолчанию в Python

Мутабельные аргументы по умолчанию в Python

@python_quiz

Разберем этот квиз

Коротко: что выведет следующий код и почему поведение такое важное для практики.

python

Вывод программы:

Почему так происходит

  • Значения аргументов по умолчанию в Python вычисляются один раз при определении функции, а не при каждом вызове.
  • В данном примере значением по умолчанию для lst является пустой список, созданный один раз. Этот список мутабелен и сохраняется между вызовами функции.
  • При первом вызове extend(1) в этот единственный список добавляется 1 → печатает [1].
  • При втором вызове extend(2) тот же список дополняется 2 → печатает [1, 2].

Анализ возможных вариантов ответов (кратко)

  • "[1]\n[2]" — соответствует ожиданию «новый пустой список создаётся при каждом вызове». Это неверно для Python: список создаётся один раз.
  • "[1]\n[1, 2]" — соответствует реальному поведению: общий мутабельный объект по умолчанию накапливает изменения.
  • "[1, 2]\n[1, 2]" — мог бы случиться, если бы функция использовала какой‑то внешний общий список и добавляла оба элемента перед первым выводом; но в данном коде порядок другой, поэтому не так.
  • "Ошибка времени выполнения" — в этом фрагменте нет ошибки: append применим к списку, ошибок не возникает.

Как исправить, если нужен «новый» список при каждом вызове
Рекомендуемый паттерн — использовать None как значение по умолчанию и создавать новый список внутри функции:

python

Другие варианты решения

  • Передавать явно пустой список при каждом вызове: extend(1, []).
  • Использовать immutable типы по умолчанию (например, None или кортеж), если это применимо.
  • Для случаев, когда нужно разделять состояния между вызовами — оставить текущую реализацию и документировать поведение.

Короткий вывод

  • Мутабельные значения по умолчанию в Python хранатся между вызовами функции. Это часто источник неожиданных багов, поэтому лучше использовать None и создавать новый объект внутри функции, если требуется независимый объект на каждый вызов.

Report Page