2012-04-12 37 views
7

Eventuali duplicati:
“Least Astonishment” in Python: The Mutable Default ArgumentPython classe costruttore con argomenti di default

Qualcuno può spiegare il seguente comportamento strano?

Ho la seguente classe:

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

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

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

e quando lo faccio quanto segue,

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 

Perché non è z2.animals una lista vuota?

Grazie, Matthias

+2

Forse non sapeva cosa cercare? A volte è difficile trovare i termini di ricerca giusti, se non si conoscono i termini. – hopla

risposta

11

Si stanno mutando l'argomento di default nel costruttore (si sta solo copiando un riferimento alla stessa lista in ciascuna delle istanze). È possibile risolvere questo come segue: lista di argomenti

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

Il valore predefinito è lo stesso oggetto per tutte le istanze, quindi assegnarlo a un membro solo assegna un riferimento allo stesso oggetto.

Ecco un esempio:

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

si può vedere che x è lo stesso oggetto in tutti i casi.

+0

ottima illustrazione di un malinteso confuso e comune! –

Problemi correlati