Особенности поведения аргументов по умолчанию в Python

Вывод будет [10], затем [123], затем [10, 'a']. Первый и третий вызовы используют общий список по умолчанию, а второй получает отдельный явно созданный пустой список.

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

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

Вывод будет [10], затем [123], затем [10, 'a']. Первый и третий вызовы используют общий список по умолчанию, а второй получает отдельный явно созданный пустой список.

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

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

Условие

Каким будет вывод программы, если выполнить следующий код?


def extend_list(val, lst=[]):
    lst.append(val)
    return lst

print(extend_list(10))
print(extend_list(123, []))
print(extend_list('a'))

Ответ

Вывод будет [10], затем [123], затем [10, 'a']. Первый и третий вызовы используют общий список по умолчанию, а второй получает отдельный явно созданный пустой список.

Точный результат:

[10]
[123]
[10, 'a']

default=[] вычисляется один раз при определении extend_list. Передача [] во втором вызове не заменяет этот default: это другой объект только для данного вызова. Чтобы каждый вызов без списка начинал с пустого контейнера, используйте lst=None и внутри if lst is None: lst = []. Явно переданные списки тогда можно продолжать изменять по договорённости.

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

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

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

Подробнее