字典(相同的值,不同的键)

时间:2009-12-09 02:43:56

标签: python dictionary

新手警报:

我是Python的新手,当我基本上在dict中添加值时,我发现当我打印整个字典时,我会获得与特定键的所有键相同的值。

好像是一个指针问题?

使用基于事件的XML解析器(SAX)时,这是一个片段:

基本上对于“row”的每个结束元素,我通过它的键存储元素:self.Id,其中self是元素。

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

2 个答案:

答案 0 :(得分:4)

当然,self中的每个条目都会获得self.mapping的值,因为这是您存储的唯一值。您是不是想在此时获取self或其某些属性的副本/快照,然后在再次存储之前更改self ...?

编辑:由于OP已澄清(在评论中)他们确实需要复制一份:

import copy

...

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

或者,如果copy.deepcopy(self)具有self,则在其属性中,需要递归复制的字典,列表等(当然包括self.mapping)会导致相当奇特的结果 - 如果正常,浅copy.copy是不够的,可能值得为自己的类添加特殊方法来自定义深度复制,以避免通常会导致...的副本副本的爆炸; - 。)

答案 1 :(得分:2)

如果我明白你在说什么,那么这可能是预期的行为。当您在Python中进行赋值时,您只需分配引用(有点像指针)。当你这样做时:

self.mapping[self.Id] = self

然后对self的未来更改将反映在您刚刚执行的映射的值中。 Python不会“复制”对象(除非你专门编写代码),它只分配引用。