字典(相同值,不同键)

0 投票
2 回答
828 浏览
提问于 2025-04-15 16:49

新手警告:

我刚开始学Python,当我往字典里添加值的时候,发现当我打印整个字典时,某个特定键的所有值都是一样的。

这看起来像是指针的问题?

下面是我使用基于事件的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 个回答

2

如果我理解你的意思,那么这可能是正常的情况。当你在Python中进行赋值时,其实是在给一个引用(有点像指针)赋值。当你这样做的时候:

self.mapping[self.Id] = self

那么对self的后续修改会在你刚才做的那个映射中显示出来。Python并不会“复制”对象(除非你特别写代码去做这件事),它只是赋值引用而已。

4

你会发现,self.mapping里的每一项都会得到self的值,因为那里存储的就是这个值。你是不是想在那个时候把self或者它的一些属性做个快照,结果self在再次存储之前又发生了变化呢?

编辑:因为提问者在评论中澄清了他们确实需要做个复制:

import copy

...

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

或者,如果self的属性中有字典、列表等需要递归复制的内容,可以使用copy.deepcopy(self)(这当然包括self.mapping,可能会导致一些奇怪的结果——如果普通的浅复制copy.copy不够用,可能需要在self的类中添加一个特殊方法来定制深复制,以避免出现大量复制的复制的复制……这种情况通常会发生;-)。

撰写回答