Я нахожусь в точке изучения 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?