Parece que una_lista todavía se inicializa una sola vez
"inicialización" no es algo que sucede a las variables en Python, ya que las variables en Python son sólo nombres. La "inicialización" solo le sucede a los objetos, y se realiza a través del método de clase '__init__
.
Cuando escribe a = 0
, eso es una tarea. Es decir que "a
se referirá al objeto que se describe con la expresión 0
". No es inicialización; a
puede nombrar cualquier otra cosa de cualquier tipo en cualquier momento posterior, y eso sucede como resultado de asignar algo más al a
. La asignación es solo asignación. El primero no es especial.
Cuando escribe def good_append(new_item, a_list=None)
, eso no es "inicializar" a_list
. Está configurando una referencia interna a un objeto, el resultado de evaluar None
, de modo que cuando se invoca good_append
sin un segundo parámetro, ese objeto se asigna automáticamente al a_list
.
significa una_lista sólo reconfiguradas a [] en la primera invocación
No, a_list
se establece en []
cualquier momento que a_list
es None
, para empezar. Es decir, cuando None
se pasa explícitamente, o el argumento se omite.
El problema con []
ocurre porque la expresión[]
sólo es evaluaron una vez en este contexto. Cuando se compila la función, se evalúa []
, se crea un objeto de lista específico, que está vacío para comenzar, y ese objeto se utiliza como el predeterminado.
¿Cómo se borra a_list
cada vez que se ejecuta good_append
?
No lo es. No necesita ser.
¿Sabes cómo se describe el problema como que está con "argumentos por defecto mutables"?
None
no se puede modificar.
El problema se produce cuando modifica el objeto que el parámetro tiene como valor predeterminado.
a_list = []
no modifica el objeto a_list
anteriormente mencionado. No puede; los objetos arbitrarios no pueden transformarse mágicamente in situ en listas vacías. a_list = []
significa que "a_list
dejará de referirse a lo que se refería anteriormente y comenzará a referirse al []
". El objeto anteriormente mencionado no ha cambiado.
Cuando se compila la función, y uno de los argumentos tiene un valor predeterminado, ese valor - un objeto - se cuela en la función (¡que a su vez es un objeto!). Cuando escribe código que muta un objeto, el objeto muta. Si el objeto al que se hace referencia pasa a ser el objeto cocido en la función, sigue mutando.
Pero no puede mutar None
. Es inmutable
Puede mutar []
. Es una lista y las listas son mutables. Agregar un elemento a una lista muta la lista.
Muchas gracias; la frase "lo que sucede cuando se llama' f() 'es un implícito' x = f.func_defaults [0] '" fue vital para mi comprensión. –
... tanto que estoy cambiando de opinión, una vez más, y marcándolo como la respuesta correcta. –