Duplicar posibles:
“Least Astonishment” in Python: The Mutable Default ArgumentPython: Diccionario como instancia de variable
Estoy muy confundido sobre el comportamiento de los diccionarios como variables de instancia de clase en Python 3. La manera en que yo lo entiendo , las variables de instancia en Python tienen almacenamiento por instancia, a diferencia de las variables de clase que son por clase (similar a lo que algunos otros idiomas llaman "estático").
Y esto parece ser cierto, excepto cuando la variable de instancia es un diccionario creado a partir de un parámetro predeterminado. Por ejemplo:
salidasclass Foo:
def __init__(self, values = dict()):
self.values = values
f1 = Foo()
f1.values["hello"] = "world"
f2 = Foo()
print(f2.values)
Este programa:
{'hello': 'world'}
Huh? ¿Por qué la instancia f2
tiene la misma instancia de diccionario que f1
?
recibo el comportamiento esperado si no paso en un diccionario vacío como un parámetro por defecto, y justo asigno self.values
a un diccionario vacío de forma explícita:
class Foo:
def __init__(self):
self.values = dict()
Pero no puedo ver por qué esto debería hacer alguna diferencia
Es posible que los parámetros predeterminados solo se evalúen una vez, cuando se carga la clase. De esta forma, simplemente está asignando la misma referencia como parámetro predeterminado. –
El desbordamiento de pila tiene una bonita función de "Preguntas frecuentes" por etiqueta. Aquí están las preguntas más frecuentes para la etiqueta de Python: http://stackoverflow.com/questions/tagged/python?sort=faq&pagesize=30 Su pregunta se responde en la pregunta número 4. –