Рассмотрите следующий фрагмент на Python: def add_item(item, lst=[]): lst.append(item); return lst; — объясните, почему это может вести к неожиданному поведению и как это исправить

13 Мар в 09:19
21 +1
0
Ответы
1
Проблема: значение по умолчанию вычисляется один раз при определении функции, поэтому если это изменяемый объект (список), все последующие вызовы будут работать с одним и тем же объектом, а не создавать новый список при каждом вызове.
Пример неожиданного поведения:
```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]
```
Альтернативы/замечания:
- Если нужен именно общий накопитель между вызовами — текущее поведение годится.
- Можно также явно передавать новый список при каждом вызове или использовать неизменяемые типы в качестве значений по умолчанию.
13 Мар в 09:25
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир