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