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

Список по умолчанию создаётся один раз при определении функции, а не заново при каждом вызове. Поэтому последующие вызовы без my_list продолжают изменять и возвращать тот же список.

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

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

Список по умолчанию создаётся один раз при определении функции, а не заново при каждом вызове. Поэтому последующие вызовы без my_list продолжают изменять и возвращать тот же список.

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

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

Условие

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


def add_item_to_list(item, my_list=[]):
    my_list.append(item)
    return my_list

print(add_item_to_list(1))

Ответ

Список по умолчанию создаётся один раз при определении функции, а не заново при каждом вызове. Поэтому последующие вызовы без my_list продолжают изменять и возвращать тот же список.

Первый вызов печатает [1], но следующий add_item_to_list(2) вернёт [1, 2]. Безопасный вариант для независимых вызовов:

def add_item_to_list(item, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(item)
    return my_list

Явно переданный список по-прежнему меняется. Проверяйте is None, а не if not my_list, чтобы не заменить переданный пустой список другим объектом. Изменяемый default допустим при намеренно общем состоянии, но здесь это неожиданное поведение.

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

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

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

Подробнее