Изменяемый объект в качестве параметра по умолчанию

Вывод — [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]. Если вызывающий код передал список явно, он по-прежнему изменяется — это отдельная часть исходного контракта.

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

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

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

Подробнее