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?