可能重复:
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)
Run Code Online (Sandbox Code Playgroud)
当我做以下事情时,
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
Run Code Online (Sandbox Code Playgroud)
为什么z2.animals不是空列表?
谢谢,马蒂亚斯
Ste*_*yne 15
您正在改变构造函数中的默认参数(您只是将对同一列表的引用复制到每个实例中).您可以按如下方式解决此问题:
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)
Run Code Online (Sandbox Code Playgroud)
默认参数列表是所有实例的相同对象,因此将其分配给成员只会分配对同一对象的引用。
这是一个例子:
>>> class foo():
... def __init__(self, x = []):
... print id(x)
...
>>> x = foo()
140284337344168
>>> y = foo()
140284337344168
>>> z = foo()
140284337344168
Run Code Online (Sandbox Code Playgroud)
你可以看到x
在所有实例中都是同一个对象。