Поведение функции с изменяемым параметром по умолчанию

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

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

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

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

Подробнее