可能重複:
「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