2012-04-12 19 views
7

Olası Çoğalt:
“Least Astonishment” in Python: The Mutable Default ArgumentPython sınıf yapıcısı

kimse şu garip davranışlar açıklayabilir misiniz?

Aşağıdaki sınıf var:

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

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

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

ve ben aşağıdakileri yaptığınızda,

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 

Neden z2.animals boş bir liste değildir?

sayesinde Matthias

+2

Belki de ne arayacağımı bilmiyor muydu? Şartları bilmiyorsanız bazen doğru arama terimlerini bulmak zor. – hopla

cevap

11

Sen yapıcısı varsayılan argüman mutasyona vardır (Eğer sadece örneklerinin her birine aynı listede bir başvuru kopyaladığınız).

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

varsayılan argüman listesi tüm örnekler için aynı nesnedir sadece aynı nesneye bir başvuru atar dolayısıyla bir üyesine atama: Bunu aşağıdaki şekilde çözebilirsiniz.

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

Eğer x tüm durumlarda aynı nesne olduğunu görebilirsiniz:

işte size bir örnek.

+0

Kafa karıştırıcı ve yaygın bir yanlış anlaşılmanın harika bir örneği! –

İlgili konular