具有默认参数的Python类构造函数

可能重复:
Python中的“最小惊讶”:可变的默认参数

任何人都可以解释以下奇怪的行为?

我有以下课程:

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不是一个空列表?

谢谢,Matthias


您在构造函数中改变默认参数(您只是将对同一列表的引用复制到每个实例中)。 你可以解决这个问题如下:

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)

默认参数列表是所有实例的同一个对象,因此将其分配给成员只是将引用分配给同一对象。

这里是一个例子:

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

你可以看到x在所有实例中都是同一个对象。

链接地址: http://www.djcxy.com/p/28525.html

上一篇: Python class constructor with default arguments

下一篇: Python class function default variables are class objects?