Python kwarg共享实例

时间:2017-02-02 10:46:08

标签: python kwargs

我注意到了我在python中对kwargs没有想到的效果,我想确认我已经完全理解它/获得更好的理解。

我的示例代码

class Obj(object):
    pass

def Foo(kwarg=Obj()):
     return kwarg

def Bar(kwarg=None):
     if not kwarg:
         kwarg = Obj()
     return kwarg

现在我才明白,最近这些功能会有所不同。

除非在调用kwarg时传递,否则Foo每次都会返回相同的Obj实例,而Bar每次都会返回不同的Obj实例。

是否会发生这种情况,因为关键字参数在编译时被分配给其RHS的已解析值,导致每次返回的同一实例中都是相同的。

1 个答案:

答案 0 :(得分:2)

你知道了,但是在vanilla python中没有编译。 :)这是引用形式“The Hitchhiker's Python指南”:

  

Python的默认参数在定义函数时被计算一次,而不是每次调用函数时(比如Ruby)。这意味着如果你使用一个可变的默认参数并对其进行变异,那么你将会对该对象进行变异,以便将来调用该函数。

http://docs.python-guide.org/en/latest/writing/gotchas/