python OOP 类方法保留变量。奇怪的范围界定事情

标签 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

我遇到的问题与传递给 Thing 类的 attrs 字典有关。问题是,每次我使用 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']}

我的问题分为两部分:

为什么会发生这种情况?

如何修复它?

最佳答案

函数的可选参数被初始化一次。由于 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)

关于python OOP 类方法保留变量。奇怪的范围界定事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51969610/

相关文章:

java - 仅当方法被重写时,通过扩展类调用方法才有效

javascript - 如何使用 jQuery 在 JavaScript 中获取基于类的对象?

c++ - 尝试在单独的类中定义变量时遇到一些问题 - 习惯使用一个。

java - 为什么在 Java 中使用类作为结构的坏习惯?

python - 按下一页链接爬行

python - pyparsing scanString 带有空格无法解析

ios - 自定义 View 类中的 init coder 函数出现问题

python - 如何定义 __init__ 以便它接受来自 Python 中其他类的对象集合

python - 如何更改 seaborn pairplot 中轴标签和值的大小

python - 将所有内容从 argparse 重定向到套接字连接,但通常不重定向到 stdout