2011-04-19 11 views
24

Aquí hay una función. Mi intención es usar los valores predeterminados de los argumentos de las palabras clave para convertir el diccionario en un diccionario vacío si no se proporciona.diccionario vacío como valor predeterminado para el argumento de palabra clave en la función python: el diccionario parece no inicializarse a {} en llamadas posteriores?

>>> def f(i, d={}, x=3) : 
...  d[i] = i*i 
...  x += i 
...  return x, d 
... 
>>> f(2) 
(5, {2: 4}) 

Pero cuando lo siguiente llamada f, me sale:

>>> f(3) 
(6, {2: 4, 3: 9}) 

Parece el argumento de palabra clave d en la segunda llamada no apunta a un diccionario vacío, sino más bien al diccionario ya que fue dejado al final de la llamada anterior. El número x se restablece a tres en cada llamada.

Ahora puedo solucionar esto, pero me gustaría que tu ayuda lo entendiera. Creí que los argumentos de las palabras clave están en el ámbito local de la función, y se eliminarían una vez que se devuelva la función. (Disculpe y corrija mi terminología si estoy siendo impreciso.)

Por lo que el valor local señalado por el nombre d debe eliminarse, y en la próxima llamada, si no proporciono el argumento de palabra clave d, entonces d debe establecerse en default {}. Pero como puede ver, d se está configurando en el diccionario al que apuntó en la llamada anterior.

¿Qué está pasando?

¿Está el literal {} en la línea def en el alcance adjunto?

Este comportamiento se ve en 2.5, 2.6 y 3.1.

+1

Eso es un típico Gotcha pitón: [valores predeterminados mutables para argumentos de la función/método] (http://pythonconquerstheuniverse.wordpress.com/category/python-gotchas/) –

Respuesta

2
>>> def f(i, d=None, x=3): 
...  if not d: 
...   d={} 
...  d[i] = i*i 
...  x += i 
...  return x,d 
... 
>>> f(2) 
(5, {2: 4}) 
>>> f(3) 
(6, {3: 9}) 
>>> 
+1

podemos definir como d = d o {}. –

Cuestiones relacionadas