Разберитесь в поведении этого кода на Python: def append_to_list(x, lst=[]): lst.append(x); return lst; — почему он ведёт себя неожиданно, и как изменить функцию для обычного поведения
Коротко — потому что значение аргумента по умолчанию вычисляется один раз при определении функции, а не при каждом вызове. Если это изменяемый объект (список, словарь и т. п.), все вызовы будут работать с одним и тем же объектом. Пример поведения: 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 []`, если вам важно отличать явно переданный пустой список от отсутствия аргумента (пустой список — ложное значение в булевом контексте).
Пример поведения:
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 []`, если вам важно отличать явно переданный пустой список от отсутствия аргумента (пустой список — ложное значение в булевом контексте).