Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典(相同值,不同键)_Python_Dictionary - Fatal编程技术网

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

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...

新手警报:

我是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

当然,对于
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等)。如果要复制值,请签出复制模块如果要复制值,请签出复制模块