¿Por qué el uso de None soluciona el problema del argumento predeterminado mutable de Python?

Estoy en el punto de aprender Python donde estoy tratandoel problema Argumento predeterminado mutable.

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

Entiendo quea_list se inicializa solo cuando eldef La declaración se encuentra por primera vez, y es por eso que las llamadas posterioresbad_append Usa el mismo objeto de lista.

Lo que no entiendo es por quégood_append Funciona de forma diferente. Parece quea_list haríatodavía ser inicializado una sola vez; por lo tanto, elif declaración solo sería verdadera en la primera invocación de la función, lo que significaa_list solo se restablecería a[] en la primera invocación, lo que significa que todavía se acumularía todo el pasadonew_item Los valores y todavía estar en buggy.

¿Por qué no lo es? ¿Qué concepto me estoy perdiendo? Cómoa_list limpiarse cada vezgood_append ¿carreras?

Respuestas a la pregunta(4)

Su respuesta a la pregunta