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

В Python изменяемые аргументы по умолчанию (например, списки или словари) инициализируются один раз при определении функции, а не при каждом её вызове.

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

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

В Python изменяемые аргументы по умолчанию (например, списки или словари) инициализируются один раз при определении функции, а не при каждом её вызове. Это значит, что если внутри функции вы изменяете такой аргумент, то при последующих вызовах функция будет использовать уже изменённый объект, а не новый.

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

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

В Python изменяемые аргументы по умолчанию (например, списки или словари) инициализируются один раз при определении функции, а не при каждом её вызове. Это значит, что если внутри функции вы изменяете такой аргумент, то при последующих вызовах функция будет использовать уже изменённый объект, а не новый.

Пример:

def func(a, my_list=[]):
    my_list.append(a)
    print(my_list)

func(1)  # Выведет: [1]
func(2)  # Выведет: [1, 2]
func(3)  # Выведет: [1, 2, 3]

Здесь my_list сохраняет изменения между вызовами, что часто приводит к ошибкам.

Чтобы избежать этого, обычно используют None в качестве значения по умолчанию и внутри функции создают новый объект:

def func(a, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(a)
    print(my_list)

Теперь при каждом вызове создаётся новый список.

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

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

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

Подробнее