Python:Dictionary作为实例变量

可能重复:
Python中的“最小惊讶”:可变的默认参数

我对Python 3中字典的行为类型实例变量非常困惑。根据我的理解,Python中的实例变量具有每个实例的存储空间,与每个类的类变量不同(类似于某些其他语言所称的“静态的”)。

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

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

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


这是Python中的一个众所周知的惊喜。 当函数被定义时,而不是被调用时,默认参数被评估。 所以你的默认参数是一个普通dict的参考。 它与分配给类/实例变量无关。

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

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

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

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

如果你提供一个values ,那就会被使用。 如果不是这样, values作为评估FALSE通过or运营商和实例化一个新的字典。

链接地址: http://www.djcxy.com/p/28531.html

上一篇: Python: Dictionary as instance variable

下一篇: Default value in a function in Python