python OOP类方法保留变量。奇怪的作用域

时间:2018-08-22 14:53:15

标签: python class oop dictionary scope

我有两个类,一个主类创建另一个类的实例。

class Builder:

    def __init__(self, id):
        self.id = id

    def build_thing(self, main_ftr, main_attr, attrs = {}):
        # note the main ftr/attrs gets added to attrs no matter what
        attrs[main_ftr] = attrs.get(main_ftr, []) + [main_attr]

        return Thing(main_ftr, main_attr, attrs)

class Thing:

    def __init__(self, main_ftr, main_attr, attrs):
        self.main_ftr = main_ftr
        self.main_attr = main_attr
        self.attrs = attrs

我遇到的问题与传递给attrs类的Thing字典有关。问题在于,每次我使用Builder类创建一个Thing类时,attrs参数都会保留其先前的值

b = Builder('123')

t = b.build_thing('name', 'john')
print(t.attrs) # {'name': ['john'] }

# Goal is this creates a new "Thing" with only attrs = {'name':['mike']}
t2 = b.build_thing('name', 'mike')
print(t2.attrs) # {'name': ['john', 'mike']}

我的问题分为2部分:

为什么会这样?

我该如何解决?

1 个答案:

答案 0 :(得分:3)

函数的可选参数被初始化一次。由于attrs是可变的,因此每次调用该函数时,都将新的键值对添加到此字典中,并将其保留以备以后调用。如果您需要可变的数据结构作为默认参数,请使用以下命令:

def build_thing(self, main_ftr, main_attr, attrs=None):
    if attrs is None:
        attrs = {}
    attrs[main_ftr] = attrs.get(main_ftr, []) + [main_attr]
    return Thing(main_ftr, main_attr, attrs)