Python 字典(相同值,不同键)
新手警报: 我是Python新手,当我基本上向dict添加值时,我发现当我打印整个字典时,对于一个特定键的所有键,我得到相同的值 好像是指针问题 下面是使用基于事件的XML解析器(SAX)时的一个片段: 基本上,对于“row”的每个结束元素,我都通过其键存储元素:self.Id,其中self是元素Python 字典(相同值,不同键),python,dictionary,Python,Dictionary,新手警报: 我是Python新手,当我基本上向dict添加值时,我发现当我打印整个字典时,对于一个特定键的所有键,我得到相同的值 好像是指针问题 下面是使用基于事件的XML解析器(SAX)时的一个片段: 基本上,对于“row”的每个结束元素,我都通过其键存储元素:self.Id,其中self是元素 def endElement(self, name): if name == "row": self.mapping[self.Id] = self print "Storing...
def endElement(self, name):
if name == "row":
self.mapping[self.Id] = self
print "Storing...: " + self.DisplayName + " at Id: " + self.Id
当然,对于
self.mapping
中的每个条目,您都会得到self
值,因为这是您存储在那里的唯一值。您是不是打算在此时复制/快照self
或其某些属性,然后在再次存储之前对其进行更改
编辑:正如OP(在评论中)澄清的那样,他们确实需要复印一份:
import copy
...
self.mapping[self.Id] = copy.copy(self)
或者,使用
copy.deepcopy(self)
如果self
的属性中有需要递归复制的字典、列表等(这当然包括self.mapping
,这会导致相当特殊的结果——如果普通的、浅层的copy.copy
不够,那么可能值得在self的类中添加特殊的方法来定制深度复制,以避免通常会导致的…副本的副本爆炸;-).当然,对于self.mapping
中的每个条目,您都会得到值self
,因为这是您存储在那里的唯一值。您的意思是在那一点上对self
或其某些属性进行复制/快照,然后在再次存储之前对其进行更改。。
编辑:正如OP(在评论中)澄清的那样,他们确实需要复印一份:
import copy
...
self.mapping[self.Id] = copy.copy(self)
或者,使用
copy.deepcopy(self)
如果self
的属性中有需要递归复制的字典、列表等(这当然包括self.mapping
,这会导致相当特殊的结果——如果普通的、浅层的copy.copy
不够,那么可能值得在self的类中添加特殊的方法来定制深度复制,以避免通常会导致的…副本的副本爆炸;-).如果我理解您的意思,那么这可能是预期的行为。当您在Python中进行赋值时,您只是在赋值引用(有点像指针)。当您这样做时:
self.mapping[self.Id] = self
然后,对
self
的未来更改将反映在您刚才所做的映射的值中。Python不会“复制”对象(除非您专门为此编写代码),它只分配引用。如果我理解您的意思,那么这可能是预期的行为。当您使用Python进行分配时,您只是分配引用(有点像指针)。当您这样做时:
self.mapping[self.Id] = self
然后,对
self
的未来更改将反映在您刚才所做的映射的值中。Python不会“复制”对象(除非您专门为此编写代码),它只分配引用。我使用的是sax解析器,因此每当到达元素末尾时都会调用endElement…我试图将元素存储在其IdAlex,谢谢,是的,这就是我的意思。我如何分配“副本”而不是“引用”?导入副本
并存储复制.copy(self)
(或复制.deepcopy(self)
如果您需要所有容器的递归副本作为属性:列表、dict等)。我使用的是sax解析器,因此每当到达元素末尾时都会调用endElement…我试图将元素存储在其IdAlex,谢谢,是的,这就是我的意思。我如何分配“副本”而不是“引用”?导入副本
并存储copy.copy(self)
(或copy.deepcopy(self)
如果需要作为属性的所有容器的递归副本:列表、dict等)。如果要复制值,请签出复制模块如果要复制值,请签出复制模块