Назад к вопросам
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), затем новый список |
| Изменение объекта | Изменения сохраняются | Изменения не влияют на следующие вызовы |