Будут напечатаны [10], затем [10, 10], затем [10, 10, 10]. Все вызовы без аргумента используют один список, созданный при определении функции.
Поведение функции с изменяемым аргументом по умолчанию
Будут напечатаны [10], затем [10, 10], затем [10, 10, 10]. Все вызовы без аргумента используют один список, созданный при определении функции.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой результат будет напечатан при выполнении приведённого кода? Возможные варианты ответа:
- [10] [10, 10] [10, 10, 10]
- возникнет ошибка
- [10] [10] [10]
- [10, 10, 10] [10, 10, 10] [10, 10, 10]
- [] [10] [10, 10]
def func(data=[]):
data.append(10)
return data
print(func())
print(func())
print(func())
Ответ
Будут напечатаны [10], затем [10, 10], затем [10, 10, 10]. Все вызовы без аргумента используют один список, созданный при определении функции.
Каждый append меняет тот же объект, но print выполняется сразу после соответствующего вызова, поэтому предыдущие строки вывода не обновляются задним числом.
Для независимых списков:
def func(data=None):
if data is None:
data = []
data.append(10)
return data
Теперь три вызова без аргументов каждый вернут [10]. Если список передан явно, функция по-прежнему изменит его. Проверка is None сохраняет это поведение и для явно переданного пустого списка.