🖥 Почему использовать изменяемые объекты как параметры по-умолчанию плохо. Приведите пример плохого случая. Как исправить



Функция создается однажды при загрузке модуля. Именованные параметры и их дефолтные значения тоже создаются один раз и хранятся в одном из полей объекта-функции.



В нашем примере 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]


Сказанное выше актуально в т.ч. для множеств и словарей.



@python_job_interview