2012-04-12 16 views
7

Duplicar posibles:
“Least Astonishment” in Python: The Mutable Default ArgumentPython constructor de la clase con los argumentos por defecto

¿Puede alguien explicar el siguiente comportamiento extraño?

tengo la clase siguiente:

class Zoo: 
    def __init__(self,alist=[]): 
     self.animals = alist 

    def __len__(self): 
     return len(self.animals) 

    def add(self,a): 
     self.animals.append(a) 

y cuando lo haga lo siguiente,

In [38]: z=Zoo() 
In [39]: z.add(2) 
In [40]: z.add(23) 
In [41]: len(z) 
Out[41]: 2 

In [42]: z2=Zoo() 

In [43]: len(z2) 
Out[43]: 2 

¿Por qué no z2.animals una lista vacía?

Gracias, Matthias

+2

¿Tal vez no sabía qué buscar? A veces es difícil encontrar los términos de búsqueda correctos, si no conoce los términos. – hopla

Respuesta

11

Usted está mutando el argumento por defecto en su constructor (que son sólo copiar una referencia a la misma lista en cada una de las instancias). Puedes solucionar este problema de la siguiente manera: lista de argumentos

class Zoo: 
    def __init__(self,alist=None): 
     self.animals = alist or [] 

    def __len__(self): 
     return len(self.animals) 

    def add(self,a): 
     self.animals.append(a) 
4

El valor por defecto es el mismo objeto para todos los casos, por lo tanto, asignarlo a un miembro simplemente asigna una referencia al mismo objeto.

He aquí un ejemplo:

>>> class foo(): 
... def __init__(self, x = []): 
...  print id(x) 
... 
>>> x = foo() 
140284337344168 
>>> y = foo() 
140284337344168 
>>> z = foo() 
140284337344168 

se puede ver que x es el mismo objeto en todos los casos.

+0

¡gran ilustración de un concepto erróneo confuso y común! –

Cuestiones relacionadas