В коде на Python объясните поведение и исправьте ошибку: def add_item(x, lst=[]): lst.append(x); return lst; Почему использование этого шаблона опасно в реальных проектах

23 Дек 2025 в 06:43
23 +1
0
Ответы
1
Проблема: аргумент по умолчанию `lst=[]` создаётся один раз при определении функции и затем используется повторно при всех вызовах без передачи `lst`. Из‑за этого список накапливает значения между вызовами.
Пример поведения:
- `add_item(1)` вернёт [1][1][1]
- `add_item(2)` вернёт [1,2][1, 2][1,2] — не [2][2][2], потому что тот же список reused
- `add_item(3, [])` вернёт [3][3][3] — если передали новый список, всё нормально
Исправление (общепринятый паттерн — использовать `None` и создавать новый список внутри):
def add_item(x, lst=None):
if lst is None:
lst = []
lst.append(x)
return lst
Альтернатива с уникальным маркером:
_sentinel = object()
def add_item(x, lst=_sentinel):
if lst is _sentinel:
lst = []
lst.append(x)
return lst
Почему это опасно в реальных проектах:
- приводит к неожиданному разделяемому состоянию между вызовами функции; баги трудно отследить.
- может вызвать утечки данных (если список должен быть «чистым» для каждого вызова).
- ухудшает модульность и тестируемость; в многопоточной среде вызывает дополнительные риски.
Вывод: для изменяемых типов (list, dict, set и т. п.) не используйте их как значения по умолчанию — создавайте новые структуры внутри функции.
23 Дек 2025 в 06:51
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир