Вопрос на собеседовании · Python-разработчик

Изменяемый аргумент по умолчанию: в чём ловушка?

Короткий ответ, ключевые тезисы и ошибки, которых стоит избежать на интервью.

Обновлено 10 августа 2026 г.Встречается почти всегда
Короткий ответ

Значения аргументов по умолчанию вычисляются один раз при создании функции, а не при каждом вызове. Поэтому список или словарь, изменённый в первом вызове, будет тем же объектом в последующих вызовах.

Безопасный шаблон — использовать None как маркер и создавать новый объект внутри функции. Если None является допустимым бизнес-значением, применяют отдельный объект-sentinel, чтобы различать отсутствие аргумента и явно переданное значение.

01 · Структура ответа

Что важно сказать интервьюеру

Начните с определения, затем объясните механизм и закончите примером из практики. Для полного ответа раскройте эти тезисы:

Проблема относится к любому изменяемому объекту, а не только к спискам.
Объект создаётся в момент выполнения def.
Проверка обычно выглядит как if value is None, а не if not value.
То же правило можно намеренно использовать как простой кеш, но это должно быть очевидно.

02 · Пример

Как объяснить на практике

Функция add_item(item, items=[]) добавляет элемент в один и тот же список при каждом вызове. Вариант add_item(item, items=None) с созданием items = [] внутри даёт каждому вызову отдельный список.

Не заучивайте формулировку дословно. Свяжите принцип с задачей из собственного проекта — интервьюер почти наверняка попросит уточнить детали реализации и компромиссы.

03 · Ошибки

Чего избегать в ответе

Проверять if not items и тем самым заменять корректно переданный пустой список.
Исправлять только list, оставляя такую же проблему с dict или set.
Объяснять поведение тем, что Python случайно кеширует результат функции.

04 · Углубление

Что могут спросить следом

  1. Когда вычисляются значения по умолчанию?
  2. Зачем нужен sentinel object?
  3. Какие ещё объекты считаются изменяемыми?

Практика ответа

Ответьте вслух, а не про себя

Откроем тренировку сразу на этом вопросе. Выберите грейд, сформулируйте ответ и сравните его с опорой.

Потренировать ответ