Lista extraña de comportamiento en clase.

He escrito una clase que tiene una lista como variable. Tengo una función que se agrega a esa lista y una función que genera esa lista.

class MyClass: myList = [] def addToList(self, myNumber): self.myList.append(myNumber) def outputList(self): for someNumber in self.myList: print someNumber 

Ahora por alguna extraña razón, si declaro dos objetos separados de la clase:

 ver1 = MyClass() ver2 = MyClass() 

y luego llame a addToList en ver1:

 ver1.addToList(3) 

y luego la lista de salida de ver2:

 ver2.outputList() 

¡Obtengo 3 como salida para la lista de la versión 2! ¿Que esta pasando?

Tu syntax es incorrecta. Está utilizando una variable de clase estática. Considera esto:

 class MyClass: myList = [] # Static variable def __init__(self): self.myRealList = [] # Member variable 

myList es en realidad una parte de la definición de MyClass, y por lo tanto es visible no solo por el nombre de la clase, sino también por todas las instancias de esa clase:

 c = MyClass() c.myList = [1] print MyClass.myList # will print [1] 

__init__ declarar “variables miembro” regulares en el constructor __init__ .

No me siento mal, llegué a Python desde un mundo C / C ++ / C #, cometí el mismo error y también me confundió al principio.

El problema es que mylist se inicializa cuando se analiza el archivo. Por lo tanto, cada inicialización subsiguiente de MyClass tendrá la misma referencia a la misma mylist.

 class MyClass: myList = [] 

En su lugar deberías inicializarlo con la clase.

 class MyClass: def __init__(self): self.myList = [] 

myList es en realidad una variable de clase (no sé si ese es el término Pythonic para ella) porque se declara fuera de cualquier función.

Para hacer que una variable sea una instancia local (una vez más, no conozco el término adecuado), debe inicializarla en su método init como “self.myList = []”.

Por favor, edite cualquier formato incorrecto de mi parte, estoy en mi teléfono.

Hay varias cosas sucediendo aquí. Puedes tener variables de instancia o clase en python. En su ejemplo, myList es una variable de clase que es estática en todas las instancias. También hay variables de instancia que son locales a una clase y puede anular las variables de clase con variables de instancia. Aquí hay un ejemplo:

 class Foo: bar = 'Hello' # Class variable def __init__(self): self.foobar = 'Hello World' # instance variable def createInstanceBar(self, x): self.bar = x # Override class variable and create instance variable a = Foo() b = Foo() print a.bar # Prints Hello print b.bar # Prints Hello print a.foobar # Prints Hello World print b.foobar # Prints Hello World a.createInstanceBar('Hello New World') print a.bar # Prints Hello New World print b.bar # Prints Hello