Por que usar o None corrige o problema de argumento padrão mutável do Python?

Eu estou no ponto de aprender Python onde estou lidandoo problema do argumento de padrão mutável.

def bad_append(new_item, a_list=[]):
    a_list.append(new_item)
    return a_list

def good_append(new_item, a_list=None):
    if a_list is None:
        a_list = []
    a_list.append(new_item)
    return a_list

Eu entendi aquiloa_list é inicializado apenas quando odef declaração é encontrada pela primeira vez, e é por isso que chamadas subseqüentes debad_append use o mesmo objeto de lista.

O que eu não entendo é porquegood_append funciona diferente. Parece quea_list seriaainda ser inicializado apenas uma vez; Portanto, oif declaração só seria verdade na primeira invocação da função, significandoa_list só seria redefinido para[] na primeira invocação, o que significa que ainda iria acumular todos os últimosnew_item valores e ainda ser buggy.

Por que não é isso? Que conceito estou perdendo? Como é quea_list fique limpo toda vezgood_append corre?

questionAnswers(4)

yourAnswerToTheQuestion