def a(b=[]):
b.append(1)
return b
print a()
print a()
De repente, recibí una lista con 2 elems, pero ¿cómo? No debe b ser configurado en la lista vacía cada vez.no entiendo la pregunta de cierres en python
gracias por la ayuda
def a(b=[]):
b.append(1)
return b
print a()
print a()
De repente, recibí una lista con 2 elems, pero ¿cómo? No debe b ser configurado en la lista vacía cada vez.no entiendo la pregunta de cierres en python
gracias por la ayuda
Nada que ver con los cierres, al menos no en el sentido habitual.
El valor predeterminado para b
no es "una nueva lista vacía"; es "este objeto particular que acabo de crear ahora mismo mientras defino la función, inicializándola para que sea una lista vacía". Cada vez que se llama a la función sin un argumento, se usa el mismo objeto.
argumentos por defecto sólo se evalúan una vez, cuando se define la función. Conserva el mismo objeto de una invocación a la siguiente, lo que significa que la misma lista sigue siendo añadida. Use un valor predeterminado de None
y verifique si desea evitar esto.
La versión corregida, por las razones expuestas en otras respuestas, es decir: se evalúan
def a(b=None):
b = [] if b is None else b
b.append(1)
return b
parámetros por defecto (una vez) cuando se define la función, no cada vez que se llama.
probar esto:
def a(b=None):
if b is None
b = []
b.append(1)
return b
print a()
print a()
Véase también http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument –