Поведение функции с изменяемым аргументом по умолчанию

Будут напечатаны [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 сохраняет это поведение и для явно переданного пустого списка.

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

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

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

Подробнее