Todavía soy bastante nuevo en Python, y mi experiencia OO proviene de Java. Así que tengo algo de código que he escrito en Python que está actuando muy raro para mí, dado el siguiente código:Alcance y listas de Python Class
class MyClass():
mylist = []
mynum = 0
def __init__(self):
# populate list with some value.
self.mylist.append("Hey!")
# increment mynum.
self.mynum += 1
a = MyClass()
print a.mylist
print a.mynum
b = MyClass()
print b.mylist
print b.mynum
Correr esto se traduce en la siguiente salida:
['Hey!']
1
['Hey!', 'Hey!']
1
Claramente, yo esperaría las variables de clase dan como resultado los mismos datos exactos, y la misma salida exacta ... Lo que parece que no encuentro en ninguna parte es lo que hace que una lista sea diferente a decir una cadena o un número, ¿por qué la lista hace referencia a la misma lista? la primera instanciación en los siguientes? Claramente, probablemente estoy entendiendo mal algún tipo de mecánica de alcance o mecánica de creación de listas.
Esto todavía pierde el punto clave; ver la respuesta de @ Ken. 'self.mynum + = 1' se expande a' self.mynum = self.mynum + 1'. Cuando esto se ejecuta, primero se evalúa el lado derecho. 'self.mynum' busca' mynum' en las instancias y no lo encuentra (al menos la primera vez que se llama '__init__'), entonces busca (y encuentra)' mynum' en la clase. Entonces el 'self.mynum' en el lado derecho evalúa el valor de' MyClass.mynum'. Ese valor ahora está asignado a 'self.mynum', que aquí se refiere a la variable de instancia. –