Вывод — [0, 1, 2, 3, 0, 1, 2, 3]. Оба вызова добавляют элементы в один и тот же список по умолчанию.
Изменяемый объект в качестве параметра по умолчанию
Вывод — [0, 1, 2, 3, 0, 1, 2, 3]. Оба вызова добавляют элементы в один и тот же список по умолчанию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Поведение функции при двух последовательных вызовах, когда её параметр по умолчанию представляет собой изменяемый тип данных.
def f(elements=[]):
for i in range(4):
elements.append(i)
return elements
a = f()
a = f()
print(a)
Ответ
Вывод — [0, 1, 2, 3, 0, 1, 2, 3]. Оба вызова добавляют элементы в один и тот же список по умолчанию.
Первый вызов f() добавляет числа 0–3. Второй не получает новый список: он продолжает изменять объект, созданный при определении функции. Повторное присваивание a не очищает этот объект.
def f(elements=None):
if elements is None:
elements = []
for i in range(4):
elements.append(i)
return elements
После такой правки два независимых вызова без аргумента возвращают отдельные списки [0, 1, 2, 3]. Если вызывающий код передал список явно, он по-прежнему изменяется — это отдельная часть исходного контракта.