Рассмотрите следующий фрагмент на Python: def add_item(item, lst=[]): lst.append(item); return lst; — объясните, почему это может вести к неожиданному поведению и как это исправить
Проблема: значение по умолчанию вычисляется один раз при определении функции, поэтому если это изменяемый объект (список), все последующие вызовы будут работать с одним и тем же объектом, а не создавать новый список при каждом вызове. Пример неожиданного поведения: ```python def add_item(item, lst=[]): lst.append(item) return lst print(add_item(1)) # -> [1] print(add_item(2)) # -> [1, 2] (ожидают [2], но список тот же) ``` Как исправить (стандартный паттерн — использовать `None` как маркер и создавать новый список внутри): ```python def add_item(item, lst=None): if lst is None: lst = [] lst.append(item) return lst print(add_item(1)) # -> [1] print(add_item(2)) # -> [2] ``` Альтернативы/замечания: - Если нужен именно общий накопитель между вызовами — текущее поведение годится. - Можно также явно передавать новый список при каждом вызове или использовать неизменяемые типы в качестве значений по умолчанию.
Пример неожиданного поведения:
```python
def add_item(item, lst=[]):
lst.append(item)
return lst
print(add_item(1)) # -> [1]
print(add_item(2)) # -> [1, 2] (ожидают [2], но список тот же)
```
Как исправить (стандартный паттерн — использовать `None` как маркер и создавать новый список внутри):
```python
def add_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
print(add_item(1)) # -> [1]
print(add_item(2)) # -> [2]
```
Альтернативы/замечания:
- Если нужен именно общий накопитель между вызовами — текущее поведение годится.
- Можно также явно передавать новый список при каждом вызове или использовать неизменяемые типы в качестве значений по умолчанию.