Проанализируйте предложенный фрагмент кода на Python: def f(a=[]): a.append(1); return a. Объясните поведение функции при многократных вызовах, укажите проблему и предложите исправления

17 Ноя в 07:03
2 +1
0
Ответы
1
Код:
def f(a=[]):
a.append(111)
return a
Поведение при многократных вызовах:
- Значение дефолтного аргумента вычисляется один раз при определении функции, поэтому один и тот же список используется при всех вызовах без явного аргумента.
- Пример последовательных вызовов: f(), f(), f() даст результаты [1][1][1], [1,1][1,1][1,1], [1,1,1][1,1,1][1,1,1].
Проблема:
- Мутируемый объект (список) как значение по умолчанию сохраняет состояние между вызовами, что приводит к неожиданному накапливанию элементов.
Исправления (рекомендованное):
1) Использовать None как маркер и создавать новый список внутри:
def f(a=None):
if a is None:
a = []
a.append(111)
return a
2) Создавать и возвращать новый список (не мутируя переданный):
def f(a=None):
base = a if a is not None else []
return base + [111]
3) Альтернатива — всегда передавать новый список при вызове: f([]) — но это менее удобно и требует дисциплины вызывающего кода.
Выбор 1 — стандартный и наиболее читабельный вариант в Python.
17 Ноя в 07:50
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир