Почему так происходит - В Python значение аргумента по умолчанию вычисляется один раз при определении функции, а не при каждом вызове. Для сигнатуры `def f(l=[]): ...` единственный список создаётся при чтении определения функции и затем повторно используется при всех вызовах. Каждый вызов делает `append`, поэтому содержимое растёт: первые вызовы вернут [1][1][1], затем [1,1][1,1][1,1], затем [1,1,1][1,1,1][1,1,1] и т.д. Как это исправить 1) Обычный паттерн с `None`: ```python def f(l=None): if l is None: l = [] l.append(1) return l ``` Теперь при каждом вызове, когда аргумент не передан, создаётся новый список. 2) Альтернатива — возвращать новый список (не менять общий объект): ```python def f(l=None): base = l if l is not None else [] return base + [1] ``` 3) Можно скопировать дефолтный список внутри функции (реже рекомендовано): ```python def f(l=[]): l = list(l) # новая копия l.append(1) return l ``` Коротко: избегайте изменяемых объектов (список, словарь и т.д.) в качестве значений по умолчанию; используйте `None` и создавайте новый объект внутри функции.
- В Python значение аргумента по умолчанию вычисляется один раз при определении функции, а не при каждом вызове. Для сигнатуры `def f(l=[]): ...` единственный список создаётся при чтении определения функции и затем повторно используется при всех вызовах. Каждый вызов делает `append`, поэтому содержимое растёт: первые вызовы вернут [1][1][1], затем [1,1][1,1][1,1], затем [1,1,1][1,1,1][1,1,1] и т.д.
Как это исправить
1) Обычный паттерн с `None`:
```python
def f(l=None):
if l is None:
l = []
l.append(1)
return l
```
Теперь при каждом вызове, когда аргумент не передан, создаётся новый список.
2) Альтернатива — возвращать новый список (не менять общий объект):
```python
def f(l=None):
base = l if l is not None else []
return base + [1]
```
3) Можно скопировать дефолтный список внутри функции (реже рекомендовано):
```python
def f(l=[]):
l = list(l) # новая копия
l.append(1)
return l
```
Коротко: избегайте изменяемых объектов (список, словарь и т.д.) в качестве значений по умолчанию; используйте `None` и создавайте новый объект внутри функции.