Дано на Python: def append_to(x, lis=[]): lis.append(x); return lis — объясните, почему поведение функции может быть неожиданным при многократных вызовах и как это исправить
Проблема: в Python значение аргумента по умолчанию вычисляется один раз при определении функции, поэтому при использовании изменяемого объекта (как список) все вызовы без явного аргумента будут работать с одним и тем же списком. Из‑за этого последовательные вызовы накапливают значения: Пример неожиданного поведения: ``` def append_to(x, lis=[]): lis.append(x) return lis print(append_to(1)) # [1] print(append_to(2)) # [1, 2] <- ожидаешь [2], а получаешь накопленный список ``` Исправление: использовать невозмущающийся sentinel (обычно `None`) и создавать новый список внутри функции, если аргумент не передан: ``` def append_to(x, lis=None): if lis is None: lis = [] lis.append(x) return lis ``` Альтернативы: передавать новый список при каждом вызове, использовать кортежы (неизменяемые) или явный sentinel-объект (если `None` валиден как значение).
Пример неожиданного поведения:
```
def append_to(x, lis=[]):
lis.append(x)
return lis
print(append_to(1)) # [1]
print(append_to(2)) # [1, 2] <- ожидаешь [2], а получаешь накопленный список
```
Исправление: использовать невозмущающийся sentinel (обычно `None`) и создавать новый список внутри функции, если аргумент не передан:
```
def append_to(x, lis=None):
if lis is None:
lis = []
lis.append(x)
return lis
```
Альтернативы: передавать новый список при каждом вызове, использовать кортежы (неизменяемые) или явный sentinel-объект (если `None` валиден как значение).