字典(相同值,不同键)
新手警告:
我刚开始学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
的类中添加一个特殊方法来定制深复制,以避免出现大量复制的复制的复制……这种情况通常会发生;-)。