Список по умолчанию создаётся один раз при определении функции, а не заново при каждом вызове. Поэтому последующие вызовы без my_list продолжают изменять и возвращать тот же список.
Проблема с изменяемым значением по умолчанию в параметрах функции
Список по умолчанию создаётся один раз при определении функции, а не заново при каждом вызове. Поэтому последующие вызовы без my_list продолжают изменять и возвращать тот же список.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разъясните, почему использование изменяемого объекта в качестве значения параметра по умолчанию в функции считается ошибкой и какие нежелательные последствия это может вызвать.
def add_item_to_list(item, my_list=[]):
my_list.append(item)
return my_list
print(add_item_to_list(1))
Ответ
Список по умолчанию создаётся один раз при определении функции, а не заново при каждом вызове. Поэтому последующие вызовы без my_list продолжают изменять и возвращать тот же список.
Первый вызов печатает [1], но следующий add_item_to_list(2) вернёт [1, 2]. Безопасный вариант для независимых вызовов:
def add_item_to_list(item, my_list=None):
if my_list is None:
my_list = []
my_list.append(item)
return my_list
Явно переданный список по-прежнему меняется. Проверяйте is None, а не if not my_list, чтобы не заменить переданный пустой список другим объектом. Изменяемый default допустим при намеренно общем состоянии, но здесь это неожиданное поведение.