Что напечатает программа с изменяемым параметром по умолчанию?

Первый вывод — [4, 5, 6], второй — [1, 2, 3, 7, 8, 9]. Значение L по умолчанию и явно переданный l — разные списки.

Короткий ответ

Что ответить на собеседовании

Первый вывод — [4, 5, 6], второй — [1, 2, 3, 7, 8, 9]. Значение L по умолчанию и явно переданный l — разные списки.

Подробный разбор

Ответ с пояснениями

Условие

Какой вывод появится в консоли после выполнения следующего кода? Функция использует изменяемый аргумент по умолчанию.

l = [1, 2, 3]
def f(a, L=[]):
    L.append(a)
    return L

f(4)
f(5)
tmp_l = f(6)
print(tmp_l)

f(7, l)
f(8, l)
f(9, l)
print(l)

Ответ

Первый вывод — [4, 5, 6], второй — [1, 2, 3, 7, 8, 9]. Значение L по умолчанию и явно переданный l — разные списки.

Первые три вызова не передают второй аргумент и последовательно изменяют один список, созданный при определении функции. tmp_l ссылается на этот объект.

Последние три вызова явно передают глобальный список l, поэтому добавляют элементы уже в него:

[4, 5, 6]
[1, 2, 3, 7, 8, 9]

Позднейший вызов f(10) без списка изменил бы также видимое содержимое tmp_l. Чтобы каждый независимый вызов начинался с пустого списка, используйте L=None и создавайте [] внутри при L is None.

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

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

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

Подробнее