2010-12-04 8 views
5
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

+2

Véase también http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument –

Respuesta

9

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.

10

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.

3

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 
1

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()