Python:字典作为实例变量

2024-06-07 22:25:15 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
“Least Astonishment” in Python: The Mutable Default Argument

我对Python 3中字典作为类实例变量的行为感到非常困惑。按照我的理解,Python中的实例变量具有每个实例的存储,这与每个类的类变量不同(类似于其他一些语言所称的“static”)。

这似乎是正确的,除非实例变量是从默认参数创建的字典。例如:

class Foo:
    def __init__(self, values = dict()):
        self.values = values

f1 = Foo()
f1.values["hello"] = "world"

f2 = Foo()
print(f2.values)

该程序输出:

{'hello': 'world'}

嗯?为什么实例f2f1具有相同的字典实例?

如果我不将空字典作为默认参数传入,而只将self.values显式分配给空字典,则会得到预期的行为:

class Foo:
    def __init__(self):
        self.values = dict()

但我不明白为什么这会有什么不同。


Tags: 实例selfhelloworld参数字典fooinit
2条回答

默认值只计算一次。你想要这样的东西:

 class Foo:
     def __init__(self, values = None):
         self.values = values or dict()

如果你提供一个values,它就会被使用。否则,or运算符将values计算为FALSE,并实例化一个新的dict

这是Python中一个众所周知的惊喜。默认参数是在定义函数时计算的,而不是在调用函数时。因此,默认参数是对公共dict的引用。它与将它分配给类/实例变量无关。

如果要使用默认参数,请使用None,并选中它:

if values is None:
    self.values = {}
else:
    self.values = values

相关问题 更多 >

    热门问题