Я нахожусь в точке изучения Python, где я имею дело с проблемой изменяемого аргумента по умолчанию.
# BAD: if 'a_list' is not passed in, the default will wrongly retain its contents between successive function calls
def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
# GOOD: if 'a_list' is not passed in, the default will always correctly be []
def good_append(new_item, a_list=None):
if a_list is None:
a_list = []
a_list.append(new_item)
return a_list
Я понимаю, что a_list
инициализируется только тогда, когда впервые встречается оператор def
, и поэтому последующие вызовы bad_append
используют один и тот же объект списка.
Я не понимаю, почему good_append
работает по-другому. Похоже, a_list
все равно будет инициализирован только один раз; следовательно, оператор if
будет истинным только при первом вызове функции, что означает, что a_list
будет сброшен только в []
при первом вызове, что означает, что он все равно будет накапливать все прошлые значения new_item
и все еще будет содержать ошибки.
Почему не так? Какую концепцию мне не хватает? Как a_list
очищается каждый раз, good_append
запускается good_append
?