В Python аргументы по умолчанию — это значения параметров, которые присваиваются в определении функции. Они используются, когда вызывающий код не передал явное значение для этого параметра.
Критический момент в том, что значения аргументов по умолчанию вычисляются только один раз — в момент определения функции, а не при каждом вызове. Это означает, что если в качестве значения по умолчанию используется изменяемый объект (например, list или dict), он общий для всех вызовов этой функции, что приводит к неожиданному накоплению состояния.
# ПЛОХО: список остаётся и растёт при каждом вызове
def append_to(element, target=[]):
target.append(element)
return target
append_to(1) # возвращает [1]
append_to(2) # возвращает [1, 2] — неожиданно!
Один и тот же объект list переиспользуется каждый раз при вызове append_to без аргумента target.
Используй None как значение по умолчанию и создавай новый изменяемый объект внутри тела функции:
# ХОРОШО: новый список создаётся при каждом вызове
def append_to(element, target=None):
if target is None:
target = []
target.append(element)
return target
int, str, tuple) безопасны, потому что их нельзя модифицировать на местеlist, dict, set) лучше не использовать — применяй вместо них NoneЗначения аргументов по умолчанию в Python вычисляются каждый раз при вызове функции, что позволяет безопасно использовать изменяемые объекты в качестве значений по умолчанию.
Новый — ещё не проверен сообществом
Вы