Неочевидные последствия использования изменяемого аргумента по умолчанию

Список по умолчанию создаётся один раз при определении функции и сохраняется между вызовами. Используйте None и создавайте новый список внутри.

Короткий ответ

Что ответить на собеседовании

Список по умолчанию создаётся один раз при определении функции и сохраняется между вызовами. Используйте None и создавайте новый список внутри.

Подробный разбор

Ответ с пояснениями

Условие

Объясните, как работает передача изменяемого объекта в качестве значения параметра по умолчанию (например, списка) в функцию Python и какие побочные эффекты могут возникнуть при многократных вызовах функции.

def add_item(item, lst=[]):
    lst.append(item)
    return lst

print(add_item(1))

Ответ

Список по умолчанию создаётся один раз при определении функции и сохраняется между вызовами. Используйте None и создавайте новый список внутри.

Первый вызов add_item(1) выводит [1]. Последующий add_item(2) без второго аргумента вернёт [1, 2]: оба вызова изменяют один объект.

def add_item(item, lst=None):
    if lst is None:
        lst = []
    lst.append(item)
    return lst

Теперь независимые вызовы получают разные списки. Если вызывающий код явно передал список, функция по-прежнему изменит его. Для контракта без побочных эффектов используйте копию или return [*lst, item]. Не заменяйте проверку на if not lst: она не отличает переданный пустой список от отсутствующего аргумента.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее