Разберите следующий фрагмент Python: "def f(a, L=[]): L.append(a); return L" — объясните, почему поведение может быть неожиданным, и предложите корректную альтернативу

1 Янв в 09:51
24 +1
0
Ответы
1
Проблема: в Python значение параметра по умолчанию вычисляется один раз при определении функции и переиспользуется при последующих вызовах. В вашем фрагменте список `L=[]` создаётся единожды, поэтому все вызовы функции без явного `L` будут мутировать и возвращать один и тот же список — поведение может быть неожиданным.
Пример (ожидание: новый список при каждом вызове; фактическое поведение — накопление):
- `f(1)` возвращит [1] [1] [1] - затем `f(2)` вернёт [1,2] [1, 2] [1,2] - потом `f(3)` вернёт [1,2,3] [1, 2, 3] [1,2,3]
Если вы хотите, чтобы при каждом вызове без аргумента создавался новый список, корректный шаблон — использовать `None` как маркер и создавать список внутри функции:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
Примечание: текущая реализация допустима, если вы намеренно хотите сохранять состояние между вызовами (общий накопитель).
1 Янв в 10:01
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир