2009-12-09 200 views
0

新手提示:詞典(值相同,不同的密鑰)

我是新來的Python,當我基本上增加值的字典,我發現,當我打印整個字典,我得到某個特定鍵的所有鍵的值相同。

似乎是一個指針問題?

使用基於事件的XML解析器(SAX)時,這裏是一個片段:

基本上與「行」每結束元素,我被它存儲元素的關鍵:self.Id,其中自是元素。

def endElement(self, name): 
    if name == "row": 
    self.mapping[self.Id] = self 
    print "Storing...: " + self.DisplayName + " at Id: " + self.Id 

回答

4

你會得到價值selfself.mapping每一個條目,當然,因爲這是唯一的價值,你曾經那裏。你頗具意味採取self或者它的一些屬性複製/快照在這一點上,然後讓self改變以前被再次存儲...?

編輯:作爲OP澄清(在評論),他們確實需要採取一個副本:

import copy 

... 

    self.mapping[self.Id] = copy.copy(self) 

,或者使用copy.deepcopy(self)如果self了,在它的屬性,字典,列表等需要進行遞歸複製(當然,其中將包括self.mapping,導致相當奇怪的結果 - 如果正常,淺copy.copy是不夠的,它可能是值得加入了特殊的方法,以自我的類來定製深度複製,避免了爆炸通常會導致......副本的副本副本;-)。

+0

我使用SAX解析器,這樣的endElement是每當達到一個元素的結束叫......我想元素存儲在其標識 – 2009-12-09 02:49:34

+0

亞歷克斯,謝謝,是的,這就是我的意思。我將如何分配一個「副本」而不是「參考」? – 2009-12-09 02:53:02

+1

'進口copy'和存儲'copy.copy(個體經營)'(或'copy.deepcopy(個體經營)'如果你需要你的屬性的所有容器的遞歸副本:清單,類型的字典等)。 – 2009-12-09 02:57:26

2

如果我理解你說的話,那麼這可能是預期的行爲。當你在Python中進行賦值時,你只需要分配引用(有點像指針)。當你這樣做:

self.mapping[self.Id] = self 

self那麼未來的變化將反映在該映射你只是做了價值。 Python不會「複製」對象(除非您專門編寫代碼來這樣做),它只會分配引用。

+0

正是我所想的,謝謝! – 2009-12-09 02:50:51

+0

如果您確實要複製該值,請檢查複製模塊 – zdav 2009-12-09 02:55:15

相關問題