Python:Dictionary作为实例变量

Cha*_*l72 11 python dictionary class python-3.x

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

我对Python中的类实例变量的字典行为非常困惑.我理解它的方式,Python中的实例变量具有每个实例的存储,不像每个类的类变量(类似于其他一些语言所调用的) "静态的").

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

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

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

f2 = Foo()
print(f2.values)
Run Code Online (Sandbox Code Playgroud)

该计划输出:

{'hello': 'world'}
Run Code Online (Sandbox Code Playgroud)

咦?为什么实例f2具有相同的字典实例f1

如果我没有将空字典作为默认参数传入,并且只是self.values明确地分配给空字典,我会得到预期的行为:

class Foo:
    def __init__(self):
        self.values = dict()
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*s K 11

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

如果要使用默认参数,请使用None并检查它:

if values is None:
    self.values = {}
else:
    self.values = values
Run Code Online (Sandbox Code Playgroud)

  • *每个*可变对象都会获得相同的行为. (3认同)