Дан фрагмент на Python: def append_to(item, lst=[]): lst.append(item); return lst; Объясните, почему поведение функции может быть неожиданным при последовательных вызовах и как это исправить
Проблема: значение аргумента по умолчанию вычисляется один раз при определении функции, поэтому если это изменяемый объект (например, список), то он будет общим для всех вызовов. В вашем примере список накапливает элементы между вызовами: 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 может быть валидным значением аргумента.
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 может быть валидным значением аргумента.