可能重复:
“Least Astonishment” in Python: The Mutable Default Argument的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'}
咦?为什么实例f2
与f1
具有相同的字典实例?
我得到预期的行为,如果我没有在一个空的字典作为默认的参数传递,只是分配self.values
明确一个空的字典:
class Foo:
def __init__(self):
self.values = dict()
但我不明白为什么这应该有什么区别。
这可能是因为默认参数只会在加载类时评估一次。这样,你只是分配相同的参考作为默认参数。 – 2011-05-16 17:28:40
堆栈溢出每个标记都有一个很好的“常见问题”功能。以下是Python标记的常见问题解答:http://stackoverflow.com/questions/tagged/python?sort=faq&pagesize=30您的问题在问题编号4处得到解答。 – 2011-05-16 18:30:35