2010-05-03 10 views
7

me creado una clase:¿La lista en una clase de Python comparte el mismo objeto en 2 instancias diferentes?

class A: 
    aList = [] 

ahora tengo función que instanciar esta clase y añadir elementos a la aList.

nota: hay 2 artículos

for item in items: 
    a = A(); 
    a.aList.append(item); 

me parece que la primera A y el segundo un objeto tiene el mismo número de elementos en su aList. Supongo que el primer objeto A tendrá el primer elemento en su lista y el segundo objeto A tendrá el segundo elemento en su lista.

¿Alguien puede explicar cómo sucede esto?

PS:

me las arreglo para resolver este problema moviendo el aList dentro de un constructor:

def __init__(self): 
    self.aList = []; 

pero todavía estoy curioso acerca de este comportamiento

+0

Puedo ver en su código anterior, está asignando a 'a', el contenido de A. Uno supondría que los contenidos de 'a' serían idénticos a los de A, ¿no? –

+0

posible duplicado de [¿Cómo evito tener datos de clase Python compartidos entre instancias?] (Http://stackoverflow.com/questions/1680528/how-do-i-avoid-having-python-class-data-shared-among -instancias) –

Respuesta

9

Usted ha definido la lista como un atributo de clase.

Los atributos de clase son compartidos por todas las instancias de su clase. Cuando define la lista en __init__ como self.aList, la lista es un atributo de su instancia (uno mismo) y luego todo funciona como esperaba.

3

Usted son de clase confuso y las variables de objeto .

Si desea que los objetos:

class A(object): 
    def __init__(self): 
     self.aList = [] 

en su ejemplo aList es una variable de clase, que se puede comparar con el uso de la palabra clave 'estático' en otros idiomas. La variable de clase, por supuesto, se comparte en todas las instancias.

+0

Gracias por señalar esto. Vengo de Java Background donde tenemos una palabra clave 'estática' para variables estáticas. Ahora entiendo el razonamiento detrás de esto. Cheers =) – zfranciscus

0

En Python, las variables declaradas dentro de la definición de clase, en lugar de dentro de un método, son clase o estáticas variables. Puede estar interesado en echar un vistazo al this answer to another question.

0

Esto sucedió porque la lista es un objeto mutable, y se crea una sola vez cuando se define la clase, es por eso que se comparte cuando se crean dos instancias. Por ejemplo,

class A: 
    a = 0 #immutable 
    b = [0] #mutable 

a = A() 
a.a = 1 
a.b[0] = 1 

b = A() 
print b.a #print 0 
print b.b[0] #print 1, affected by object "a" 

Por lo tanto, para resolver el problema, podemos usar el constructor como lo que ha mencionado. Cuando ponemos la lista en el constructor, siempre que se crea una instancia del objeto, también se creará la nueva lista.

Cuestiones relacionadas