2009-12-09 126 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

相关问题