Мутабельные аргументы по умолчанию в Python
@python_quizРазберем этот квиз
Коротко: что выведет следующий код и почему поведение такое важное для практики.

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

Почему так происходит
- Значения аргументов по умолчанию в 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 как значение по умолчанию и создавать новый список внутри функции:

Другие варианты решения
- Передавать явно пустой список при каждом вызове: extend(1, []).
- Использовать immutable типы по умолчанию (например, None или кортеж), если это применимо.
- Для случаев, когда нужно разделять состояния между вызовами — оставить текущую реализацию и документировать поведение.
Короткий вывод
- Мутабельные значения по умолчанию в Python хранатся между вызовами функции. Это часто источник неожиданных багов, поэтому лучше использовать None и создавать новый объект внутри функции, если требуется независимый объект на каждый вызов.