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