Какой вариант корректно избегает ловушки с изменяемым значением по умолчанию для списка?

Adef add(x, items=[]): items.append(x); return items с пустым списком как дефолтом
Bdef add(x, items=None): с инициализацией items = [] if items is None else items
Cdef add(x, items=()): items.append(x); return items с пустым кортежем как дефолтом
Ddef add(x, items={}): items.append(x); return items со словарём как дефолтом списка
Правильный ответ. Безопасный паттерн: ставить дефолт None и создавать новый список внутри функции при каждом вызове.

Разбор

Изменяемые дефолты (список, словарь, множество) создаются один раз при определении функции и переиспользуются при каждом вызове. Чтобы избежать общих побочных эффектов между вызовами, ставят items=None, а внутри делают инициализацию: items = [] if items is None else items. Тогда при каждом вызове без аргумента создаётся новый список, и данные не «накапливаются» неожиданно между вызовами функции.

Проверь себя · 1/3разбор после ответа
Есть функция def power(x, exp=2): return x ** exp. Что вернёт вызов power(3)?
Тренировать Python в Telegram

Ещё вопросы по теме «Функции и аргументы»