2012-03-27 15 views
7

Duplicar posibles:
“Least Astonishment” in Python: The Mutable Default ArgumentEl valor de una lista vacía en el parámetro de función, ejemplo aquí

def f(a, L=[]): 
    L.append(a) 
    return L 

print(f(1, [1, 2])) 
print(f(1)) 
print(f(2)) 
print(f(3)) 

I preguntarse por qué el otro f (1), f (2) , f (3) no se ha agregado a la primera f (1, [1,2]). supongo que el resultado debería ser:

[1, 2, 1] 
[1, 2, 1, 1] 
[1, 2, 1, 1, 2] 
[1, 2, 1, 1, 2, 3] 

Pero el resultado no es esto. No se por que.

+1

@Closevoters: como es evidente en su ejemplo, él espera que el argumento predeterminado cambie, por lo que no, no es un duplicado de ningún tipo. – georg

Respuesta

6

Hay dos problemas diferentes (mejor denominados conceptos) fusionados en una declaración de problema.

El primero está relacionado con la pregunta de SO tal como lo señala agh. El hilo da una explicación detallada y no tendría sentido volver a explicarlo, excepto por el bien de este hilo. Puedo tomar el privilegio de decir que las funciones son objetos de primera clase y los parámetros y sus valores predeterminados están limitados durante la declaración. Entonces, los parámetros actúan como parámetros estáticos de una función (si algo puede hacerse posible en otros lenguajes que no admiten objetos de función de primera clase.

El segundo problema es a qué objeto de la lista se refiere el parámetro L. está pasando un parámetro, el parámetro List pasado es a lo que L está vinculado. Cuando se llama sin ningún parámetro, se parece más a vincularse con una lista diferente (la mencionada como parámetro predeterminado) que fuera de curso sería diferente de lo que se pasó en la primera llamada. Para hacer el caso más prominente, acaba de cambiar su función como seguimiento y ejecutar los ejemplos.

>>> def f(a, L=[]): 
     L.append(a) 
     print id(L) 
     return L 

>>> print(f(1, [1, 2])) 
56512064 
[1, 2, 1] 
>>> print(f(1)) 
51251080 
[1] 
>>> print(f(2)) 
51251080 
[1, 2] 
>>> print(f(3)) 
51251080 
[1, 2, 3] 
>>> 

como se puede ver, la primera c all imprime una identificación diferente del parámetro L que contrasta con las llamadas siguientes. Entonces, si las Listas son diferentes, así sería el comportamiento y dónde se agrega el valor. Esperemos que ahora debería tener sentido

+0

Gracias a todos ustedes, lo entiendo ahora. muy bien. – stardiviner

0

¿Por qué espera los resultados si llama a la función donde inicializa la lista vacía si no pasa el segundo argumento?

Para los resultados que desee, debe utilizar cierre o var global.

Cuestiones relacionadas