python:将字典追加到列表中-我看到了类似行为的指针


85

我在python解释器中尝试了以下操作:

>>>
>>> a = []
>>> b = {1:'one'}
>>> a.append(b)
>>> a
[{1: 'one'}]
>>> b[1] = 'ONE'
>>> a
[{1: 'ONE'}]
>>>

在这里,将字典'b'附加到列表'a'之后,我将更改与字典'a'中的键1对应的值。此更改也以某种方式反映在列表中。当我将字典添加到列表中时,我不仅会添加字典的值吗?好像我已将指向字典的指针附加到列表中,因此对字典的更改也反映在列表中。

我不希望更改反映在列表中。我该怎么做?

感谢您的时间!


契kh夫这不是字典'b',而是字典b名称为'b'的字典。顺便说一句,您写错了:“我正在更改与字典'a'中的键1相对应的值”“不,在字典b中。关于您的惊讶:列表不包含值,而是包含对象,因为所有内容都是Python中的对象。或更确切地说,列表包含对对象的引用。
eyquem 2011年


@eyquem感谢您的评论。我急着发布了这个。我很抱歉。
neo29 2011年

契kh夫这不是责备,只是信息。顺便说一句,如果我的回答很有用,那么可以对它进行投票。同样,您可以选择“接受”一个答案,方法是单击一个答案左侧的点数计数器下方的人字形条纹,将获得25分。或者,您可以选择不接受任何问题。
eyquem 2011年

Answers:


140

您的列表中包含对原始词典的引用,这是正确的。

a.append(b.copy()) 应该可以。

请记住,这会造成浅表复制。一种替代方法是使用copy.deepcopy(b),它可以复制一个深层副本。


6
太棒了!我在这方面受阻很长时间
Yasin

2
这让我震惊了大约半个小时,直到我放弃并决定签出堆栈。
FlyingZebra1

35

也有字典

a = []
b = {1:'one'}

a.append(dict(b))
print a
b[1]='iuqsdgf'
print a

结果

[{1: 'one'}]
[{1: 'one'}]

不知道它是否足够快于copy(),但似乎比deepcopy()快。也许使用复杂的字典模式,它将接近deepcopy(),因为dict()创建了一个新字典。
selotec '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.