Назад к вопросам
Middle
102
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

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

# Пример неправильного использования
def add_to_list(value, my_list=[]):
    my_list.append(value)
    return my_list

print(add_to_list(1))  # Вывод: [1]
print(add_to_list(2))  # Ожидалось [2], но выводит: [1, 2] - проблема из-за изменяемого значения по умолчанию

Правильный подход — использовать неизменяемое значение по умолчанию, например None, а затем внутри функции создавать новый изменяемый объект, если аргумент не был передан.

# Пример правильного использования
def add_to_list_correct(value, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(value)
    return my_list

print(add_to_list_correct(1))  # Вывод: [1]
print(add_to_list_correct(2))  # Вывод: [2] - каждый вызов создает новый список

Сравнение поведения:

Сценарий Изменяемое значение по умолчанию Неизменяемое значение по умолчанию (None)
Первый вызов функции Создается объект Создается объект (None), затем новый список
Последующие вызовы Используется существующий объект Создается новый объект (None), затем новый список
Изменение объекта Изменения сохраняются Изменения не влияют на следующие вызовы