Python函数"记住"早期的参数(**kwargs)

tjv*_*jvr 4 python kwargs

我有一些具有属性字典的对象obj.attrs.**kwargs为方便起见,这些对象的构造函数接受dict和/或.

看起来有点像这样:

class Thing:
    def __init__(self, attrs={}, **kwargs):
        for arg in kwargs:
            attrs[arg] = kwargs[arg]
        self.attrs = attrs
Run Code Online (Sandbox Code Playgroud)

这样Thing({'color':'red'})做也是如此Thing(color='red').

我的问题是构造函数以某种方式记住attrs传递给它的最后一个值.

例如:

>>> thing1 = Thing(color='red')
>>> thing2 = Thing()
>>> thing2.attrs
{'color': 'red'}
Run Code Online (Sandbox Code Playgroud)

......但thing2.attrs应该是一个空洞的词典!{}

这让我想知道这不是一个问题,使用两者 **kwargs 一个像这样的论点attrs={}.

有任何想法吗?

Bre*_*ode 11

使用默认参数的问题是它们实际上只存在一个实例.当您attrs={}init方法定义中说,该单个default {}实例是每次调用该方法的默认值(它不会每次都创建一个新的默认空dict,它使用相同的一个).

问题是,如果只有一个attrs存在,然后对于你说的每个Thing实例,你的每个实例self.attrs = attrsself.attrs成员变量都指向单个共享的默认实例attrs.

另一个问题是,这不完全是多余的吗?您可以使用**kwargs传递关键字/值args或字典.如果您刚刚定义了这个:

class Thing:
    def __init__(self, **kwargs):
        for arg in kwargs:
            self.attrs[arg] = kwargs[arg]
Run Code Online (Sandbox Code Playgroud)

所有这些策略仍然有效:

thing1 = Thing(color='red')

thing2 = Thing(**{'color':'red'})

my_dict = {'color' : 'red'}
thing3 = Thing(**my_dict)
Run Code Online (Sandbox Code Playgroud)

因此,如果您只是以这种方式定义和使用Thing,那么您将完全避免您的问题.