Приведите фрагмент на Python: "def f(a=[]): a.append(1); return a" — объясните поведение при повторных вызовах, почему это может быть неожиданно и как переписать функцию безопасно.

17 Мар в 08:44
13 +1
0
Ответы
1
Код (исходный):
```python
def f(a=[]):
a.append(1)
return a
```
Поведение при вызовах (пример):
```python
print(f()) # первый вызов
print(f()) # второй вызов
print(f()) # третий вызов
```
Вывод будет: [1][1][1], затем [1,1][1, 1][1,1], затем [1,1,1][1, 1, 1][1,1,1]. При явной передаче аргумента, например `f([10])`, используется переданный список.
Почему это неожиданно:
- Значение параметра по умолчанию вычисляется один раз при определении функции, не при каждом вызове. В данном случае это один и тот же изменяемый список, который переиспользуется между вызовами, поэтому элементы накапливаются.
Безопасный вариант (рекомендуется):
```python
def f(a=None):
if a is None:
a = []
a.append(1)
return a
```
При таком варианте каждый вызов без аргумента получает новый список, и последовательные вызовы вернут [1][1][1], [1][1][1], [1][1][1]. Обратите внимание: не стоит писать `a = a or []`, если нужно корректно отличать `None` от других "ложных" значений.
17 Мар в 09:33
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир