Почему использование `arg=None` решает проблему изменяемого аргумента Python по умолчанию?

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

22
задан smci 21 April 2019 в 08:36
поделиться