Какой вариант корректно избегает ловушки с изменяемым значением по умолчанию для списка?
A
def add(x, items=[]): items.append(x); return items с пустым списком как дефолтомB
def add(x, items=None): с инициализацией items = [] if items is None else itemsC
def add(x, items=()): items.append(x); return items с пустым кортежем как дефолтомD
def 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)?Ещё вопросы по теме «Функции и аргументы»
- Есть функция `def add(x, y): return x + y`. Что вернет вызов `add(2, 3)`?
- Дана функция `def f(a, b, c): return a * 100 + b * 10 + c`. Что вернёт вызов `f(1, c=3, b=2)`?
- Есть функция `def power(x, exp=2): return x ** exp`. Что вернёт вызов `power(3)`?
- Дана функция `def total(*args): return sum(args)`. Что вернёт вызов `total(1, 2, 3)`?
- Дан код: `x = 10` на верхнем уровне модуля и `def inc(): return x + 1`. Что вернёт вызов `inc()`?
- Все вопросы по «Функции и аргументы» →