2009-10-31 37 views
2

我是繼承字典,但遇到了一個問題setitem其中一個賦值工作,但另一個賦值不工作。我煮它歸結爲以下幾個基本問​​題:繼承python的字典,覆蓋__setitem__不保留新值

class CustomDict(dict): 
def __setitem__(self, key, value): 
    super(CustomDict, self).__setitem__(key, value) 

測試1失敗:

data = {"message":"foo"} 
CustomDict(data)["message"] = "bar" 
print CustomDict(data) # Expected "{'message': 'bar'}". Actual is "{'message': 'foo'}". 
print data # Expected "{'message': 'bar'}". Actual is "{'message': 'foo'}". 

測試2成功:

data = CustomDict({"message":"foo"}) 
data["message"] = "bar" 
print CustomDict(data) # Expected "{'message': 'bar'}". Actual matches expected. 
print data # Expected "{'message': 'bar'}". Actual matches expected. 

我在網上看了,但不能告訴是否子類的構造函數複製字典,以便在字典的不同實例上執行操作。有什麼建議?

回答

10

您正在每行上構建CustomDict的新實例。 CustomDict(data)創建了一個新實例,該實例複製data

試試這個:

cd = CustomData({"message":"foo"}) 
cd["message"] = "bar" 
print cd # prints "{'message': 'bar'}". 
+0

謝謝你,斯內德。它是一個深層的副本,以及關於在python代碼中查找字典的__init__的位置的建議? –

+0

這不是一個深層複製。 dict的代碼非常複雜,有2500行C.如果你想閱讀它,它在Objcets/dictobject.c中的一個Python源代碼發行版中。 –

+0

好的,非常感謝您的信息 –