Рассмотрите следующий фрагмент на Python: def func(items=[]): items.append(1); return items; Объясните, почему вызов func() несколько раз возвращает нарастающий список, и предложите безопасную альтернативу.
Кратко — потому что значение параметра по умолчанию вычисляется один раз при определении функции, а не при каждом вызове. В вашем примере это один и тот же список, и операция `append` модифицирует его "на месте", поэтому последовательные вызовы накапливают элементы. Пример поведения: - первый вызов возвращает [1][1][1], - второй — [1,1][1,1][1,1], - третий — [1,1,1][1,1,1][1,1,1]. Безопасная альтернатива — использовать значение по умолчанию `None` и создавать новый список внутри функции: ```python def func(items=None): if items is None: items = [] items.append(1) return items ``` Теперь каждый вызов без аргумента вернёт новый список [1][1][1]. Если вы специально хотите иметь общий накапливающий список — тогда текущее поведение с мутабельным значением по умолчанию подходит, но его нужно документировать явно.
Пример поведения:
- первый вызов возвращает [1][1][1],
- второй — [1,1][1,1][1,1],
- третий — [1,1,1][1,1,1][1,1,1].
Безопасная альтернатива — использовать значение по умолчанию `None` и создавать новый список внутри функции:
```python
def func(items=None):
if items is None:
items = []
items.append(1)
return items
```
Теперь каждый вызов без аргумента вернёт новый список [1][1][1]. Если вы специально хотите иметь общий накапливающий список — тогда текущее поведение с мутабельным значением по умолчанию подходит, но его нужно документировать явно.