Дан фрагмент на Python: def append_to(item, lst=[]): lst.append(item); return lst; Объясните, почему поведение функции может быть неожиданным при последовательных вызовах и как это исправить

3 Мар в 09:13
16 +1
0
Ответы
1
Проблема: значение аргумента по умолчанию вычисляется один раз при определении функции, поэтому если это изменяемый объект (например, список), то он будет общим для всех вызовов. В вашем примере список накапливает элементы между вызовами:
def append_to(item, lst=[]):
lst.append(item)
return lst
print(append_to(1)) # [1]
print(append_to(2)) # [1, 2] <- неожиданно, т.к. lst тот же самый объект
Исправление: использовать неизменяемый маркер (обычно None) и создавать новый список внутри функции:
def append_to(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
Теперь:
print(append_to(1)) # [1]
print(append_to(2)) # [2]
Альтернативы: использовать явное создание копии списка при необходимости, или специальный маркер (object()) вместо None, если None может быть валидным значением аргумента.
3 Мар в 09:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир