2012-04-12 234 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

相关问题