Skip to main content
 首页 » 编程设计

Python kwarg 共享实例

2024年10月01日2www_RR

我注意到 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 的解析值,导致每次返回相同实例中的相同值。

请您参考如下方法:

你明白了,但是在 vanilla python 中没有编译。 :) 这是引自“The Hitchhiker's Guide to Python”的引文:

Python’s default arguments are evaluated once when the function is defined, not each time the function is called (like it is in say, Ruby). This means that if you use a mutable default argument and mutate it, you will and have mutated that object for all future calls to the function as well.

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