【发布时间】:2011-08-26 15:08:24
【问题描述】:
可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
我对字典在 Python 3 中作为类实例变量的行为感到非常困惑。根据我的理解,Python 中的实例变量具有 per-instance 存储,不像类变量是 per -class(类似于某些其他语言所说的“静态”)。
这似乎是正确的,除非实例变量是从默认参数创建的字典。例如:
class Foo:
def __init__(self, values = dict()):
self.values = values
f1 = Foo()
f1.values["hello"] = "world"
f2 = Foo()
print(f2.values)
这个程序输出:
{'hello': 'world'}
嗯?为什么实例f2 与f1 具有相同的字典实例?
如果我不将空字典作为默认参数传递,我会得到预期的行为,只需将 self.values 明确分配给空字典:
class Foo:
def __init__(self):
self.values = dict()
但我不明白为什么这会有什么不同。
【问题讨论】:
-
可能是默认参数仅在加载类时评估一次。这样,您只需将相同的引用分配为默认参数。
-
堆栈溢出对每个标签都有一个很好的“常见问题解答”功能。以下是 Python 标记的常见问题解答:stackoverflow.com/questions/tagged/… 您的问题已在问题编号 4 中得到解答。
标签: python class dictionary python-3.x