Выполните анализ кода (фрагмент на Python): def func(a=[]): a.append(1); return a; — объясните поведение при повторных вызовах, почему возникает удивление у разработчиков и как исправить функцию

13 Июл в 15:49
15 +1
0
Ответы
1
Код:
def func(a=[]):
a.append(111)
return a
Что происходит (и пример):
- Значение дефолтного аргумента вычисляется один раз при определении функции, а не при каждом вызове. Поэтому при повторных вызовах без явного аргумента используется та же самая список.
- Пример:
- первый вызов func() вернёт [1][1][1];
- второй вызов func() вернёт [1,1][1,1][1,1];
- третий вызов func() вернёт [1,1,1][1,1,1][1,1,1].
Почему это вызывает удивление:
- Многие ожидают, что дефолтный список будет создаваться заново при каждом вызове; на самом деле используется один и тот же объект (из‑за «mutable default argument»).
Как исправить (стандартный вариант — использовать None как «sentinel»):
def func(a=None):
if a is None:
a = []
a.append(111)
return a
Альтернативы:
- Передавать всегда явно новый список: func([]).
- Использовать копирование: def func(a=None): a = list(a) if a is not None else []; a.append(\(1)); return a.
- Если цель — сохранить состояние между вызовами, то текущее поведение можно оставить (но документировать намерение).
Вывод: для избежания непреднамеренного разделяемого состояния обычно применять шаблон с \(None\) и создавать новый список внутри функции.
13 Июл в 16:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир