3

可能的重复:
Python 中的“Least Astonishment”:可变默认参数

我有这个代码

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 一个空列表的副本,然后在实例之间共享。

那么如何使用 [] 作为命名参数的默认值呢?

4

1 回答 1

7

[]如果您希望每个对象都有一个空列表,则不能直接使用。我倾向于使用解决方法:

def __init__(self, var1=None):
    if var1 is None:
        var1 = []
    ....

var1如果可以的话,这自然是行不通None的,你需要使用不同的对象。

于 2012-11-20T23:42:07.443 回答