Python:Dictionary作为实例变量

时间:2011-05-16 17:20:16

标签: python class dictionary python-3.x

  

可能重复:
  “Least Astonishment” in Python: The Mutable Default Argument

我对作为Python 3中的类实例变量的字典行为感到非常困惑。我理解它的方式,Python中的实例变量具有 per-instance 存储,不同于类变量。 -class(类似于其他一些语言所谓的“静态”)。

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

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()

但我不明白为什么这应该有所不同。

2 个答案:

答案 0 :(得分:10)

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

如果您想使用默认参数,请使用None,然后选中它:

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

答案 1 :(得分:3)

默认值仅评估一次。你想要这样的东西:

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

如果你提供values,那就会被使用。如果没有,则valuesFALSE运算符评估为or并实例化新的字典。