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