Почему использовать изменяемые объекты как параметры по-умолчанию плохо. Приведите пример плохого случая. Как исправить
Функция создается однажды при загрузке модуля. Именованные параметры и их дефолтные значения тоже создаются один раз и хранятся в одном из полей объекта-функции.
В нашем примере bar
равен пустому списку. Список – изменяемая коллекция, поэтому значение bar
может изменяться от вызова к вызову. Пример:
def foo(bar=[]):
bar.append(1)
return bar
foo()
>>> [1]
foo()
[1, 1]
foo()
>>> [1, 1, 1]
Хорошим тоном считается указывать параметру пустое неизменяемое значение, например 0
, None
, ''
, False
. В теле функции проверять на заполненность и создавать новую коллекцию:
def foo(bar=None):
if bar is None:
bar = []
bar.append(1)
return bar
foo()
>>> [1]
foo()
>>> [1]
foo()
>>> [1]
Сказанное выше актуально в т.ч. для множеств и словарей.
Oct. 10, 2023, Источник