Python类构造函数默认参数
问题描述:
可能重复:
“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不是空单吗?
感谢,马蒂亚斯
答
你是变异在构造函数的默认参数(你只是复制引用同一列表您的每一个实例)。你可以解决这个问题如下:
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
在所有情况下,同一个对象。
+0
一个混乱和常见的误解的伟大插图! – 2014-08-15 10:29:28
也许他不知道要搜索什么?如果您不了解这些条款,有时候很难提出正确的搜索条件。 – hopla 2012-04-12 13:22:11