Вывод: [10, 'a'], затем [123], затем [10, 'a']. list1 и list3 — один общий список по умолчанию, list2 создан отдельно.
Какой вывод получит программа с функцией, использующей изменяемый параметр по умолчанию?
Вывод: [10, 'a'], затем [123], затем [10, 'a']. list1 и list3 — один общий список по умолчанию, list2 создан отдельно.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, что будет выведено в консоль после выполнения приведённого кода. Функция extend_list принимает список в качестве аргумента по умолчанию, что может вызвать неожиданное накопление элементов при повторных вызовах.
def extend_list(value, Lst=[]):
Lst.append(value)
return Lst
list1 = extend_list(10)
list2 = extend_list(123, [])
list3 = extend_list('a')
print(list1)
print(list2)
print(list3)
Ответ
Вывод: [10, 'a'], затем [123], затем [10, 'a']. list1 и list3 — один общий список по умолчанию, list2 создан отдельно.
Первый вызов добавляет 10 в default-список. Второй получает явно переданный новый [], поэтому его 123 не влияет на default. Третий снова использует общий список и добавляет 'a'.
assert list1 is list3
assert list1 is not list2
Печать выполняется уже после всех трёх вызовов, поэтому даже list1 содержит позднее добавленный элемент. Чтобы устранить накопление между независимыми вызовами, используйте Lst=None и создавайте новый список внутри при Lst is None. Явно переданный список при этом по-прежнему изменяется.