Разберитесь в поведении этого кода на Python: def append_to_list(x, lst=[]): lst.append(x); return lst; — почему он ведёт себя неожиданно, и как изменить функцию для обычного поведения

18 Фев в 14:15
12 +1
0
Ответы
1
Коротко — потому что значение аргумента по умолчанию вычисляется один раз при определении функции, а не при каждом вызове. Если это изменяемый объект (список, словарь и т. п.), все вызовы будут работать с одним и тем же объектом.
Пример поведения:
def append_to_list(x, lst=[]):
lst.append(x)
return lst
Вызовы:
- append_to_list(111) вернёт [1][1][1] - append_to_list(222) вернёт [1,2][1, 2][1,2] — не новый список, а тот же, куда уже был добавлен 111.
Правильный (обычное ожидаемое) вариант — использовать None как значение по умолчанию и создавать новый список внутри:
def append_to_list(x, lst=None):
if lst is None:
lst = []
lst.append(x)
return lst
Теперь:
- append_to_list(111) вернёт [1][1][1] - append_to_list(222) вернёт [2][2][2]
Замечание: не рекомендуется писать `lst = lst or []`, если вам важно отличать явно переданный пустой список от отсутствия аргумента (пустой список — ложное значение в булевом контексте).
18 Фев в 14:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир