如何在python中使用[]作为命名函数参数的默认值?

sav*_*ent 3 python constructor named-parameters

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

我有这个代码

class Test(object):
  def __init__(self, var1=[]):
    self._var1 = var1

t1 = Test()
t2 = Test()

t1._var1.append([1])

print t2._var1
Run Code Online (Sandbox Code Playgroud)

我得到"[[1]]"作为结果.很明显,t1._var1和t2._var1正在寻址相同的列表.如果我放

t3 = Test()
print t3._var1
Run Code Online (Sandbox Code Playgroud)

然后我也得到"[[1]]".所以var1 = []似乎永久地将var1绑定到某个列表.我试着复制清单,

def __init__(self, var1=copy([])):
Run Code Online (Sandbox Code Playgroud)

但是得到了相同的结果,因此在调用init之前,似乎会计算命名参数的表达式,并且它只给var1一个空列表的副本,然后在实例之间共享.

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

Tim*_*Tim 7

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

def __init__(self, var1=None):
    if var1 is None:
        var1 = []
    ....
Run Code Online (Sandbox Code Playgroud)

当然,如果var1可能None,这将无法工作,您需要使用不同的对象.