2012-04-12 194 views
7

可能重複:
「Least Astonishment」 in Python: The Mutable Default ArgumentPython類構造函數默認參數

誰能解釋下奇怪的行爲?

我有以下類:

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

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

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

,當我這樣做,

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 

爲什麼z2.animals不是空單嗎?

感謝,馬蒂亞斯

+2

也許他不知道要搜索什麼?如果您不瞭解這些條款,有時候很難提出正確的搜索條件。 – hopla 2012-04-12 13:22:11

回答

11

你是變異在構造函數的默認參數(你只是複製引用同一列表您的每一個實例)。你可以解決這個問題如下:

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

默認參數列表是所有場合的同一對象,因此將其分配給成員只分配到同一個對象的引用。

這裏有一個例子:

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

你可以看到,x在所有情況下,同一個對象。

+0

一個混亂和常見的誤解的偉大插圖! – 2014-08-15 10:29:28

相關問題