可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
我有这段代码
class Test(object):
def __init__(self, var1=[]):
self._var1 = var1
t1 = Test()
t2 = Test()
t1._var1.append([1])
print t2._var1
我得到“[[1]]”作为结果。很明显,t1._var1和t2._var1正在寻址相同的列表。如果我把
t3 = Test()
print t3._var1
然后我也得到“[[1]]”。所以var1 = []似乎永久地将var1绑定到某个列表。我试着复制列表,
def __init__(self, var1=copy([])):
但是得到了相同的结果,因此在调用init之前,似乎会计算命名参数的表达式,并且它只给var1一个空列表的副本,然后在实例之间共享。
那么如何使用[]作为命名参数的默认值?
答案 0 :(得分:7)
如果您希望每个对象都有一个空列表,则不能直接使用[]
。我倾向于使用一种解决方法:
def __init__(self, var1=None):
if var1 is None:
var1 = []
....
如果var1
可以是None
,则自然会无效,您需要使用其他对象。