新手警报:
我是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
答案 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不会“复制”对象(除非你专门编写代码),它只分配引用。