Первый вывод — [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.