2012-11-20 46 views
3

可能重复:
“Least Astonishment” in Python: The Mutable Default Argument如何使用[]作为python中命名函数参数的默认值?

我有这样的代码

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([])): 

,但得到了同样的结果,因此对于命名参数表达出现之前进行评估,以初始化被调用,它只是给了空列表这是当时的VAR1副本在实例中共享。

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

+0

他们似乎重复。对不起,我在发布之前看过,但没看到其他问题。话虽如此,其他问题的答案都没有显示如何正确使用可变默认参数。 – savagent

回答

7

如果您希望每个对象都有一个空列表,则不能直接使用[]。我倾向于使用周围的工作:

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

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

+0

这是处理可变默认参数的非官方正式推荐模式。 ([Example](http://effbot.org/zone/default-values.htm#what-to-do-instead)) – jathanism

+0

这是故意的设计决定吗?基本原理是什么?为什么不在函数被调用时评估表达式? – savagent

+0

这不仅仅是“非官方的官方”,它在FAQ中。理由也在那里。有关详细信息,请参阅http://docs.python.org/2/faq/design.html#why-are-default-values-shared-between-objects。 – abarnert

相关问题