【问题标题】:Appending a dictionary to a list - I see a pointer like behaviorpython:将字典附加到列表中-我看到了类似行为的指针
【发布时间】:2011-07-11 19:35:39
【问题描述】:

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

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

在这里,在将字典“b”附加到列表“a”之后,我正在更改与字典“a”中的键 1 对应的值。不知何故,这种变化也反映在列表中。当我将字典附加到列表时,我不只是附加字典的值吗?看起来好像我已将指向字典的指针附加到列表中,因此对字典的更改也反映在列表中。

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

感谢您的宝贵时间!

【问题讨论】:

  • Chekhov 这不是 dictionary 'b' ,它是 dictionary bdictionary of name 'b' 。顺便说一句,您写错了:“我正在更改字典 'a' 中键 1 对应的值” 不,在字典 b 中。关于您的惊讶:列表不包含值,它包含对象,因为在 Python 中一切都是对象。或者更准确地说,一个列表包含对对象的引用。
  • Chekhov 你也应该看到这个问题:(stackoverflow.com/questions/5242933/…)
  • @eyquem 感谢您的评论。我急着发这个。我很抱歉。
  • 契诃夫 这不是责备,只是信息。顺便说一句,如果我的回答有点用,可以点赞。另外,您可以选择“接受”其中一个答案,通过点击一个答案左侧积分计数器下方的人字形条纹,它将获得25分。或者您可以选择不接受任何问题。

标签: python list dictionary


【解决方案1】:

您是正确的,因为您的列表包含对原始字典的引用

a.append(b.copy()) 应该可以解决问题。

请记住,这是一个浅拷贝。另一种方法是使用copy.deepcopy(b),它会进行深层复制。

【讨论】:

  • 太棒了!我在这个问题上被屏蔽了很长时间
  • 这让我大吃一惊大约半小时,直到我放弃并决定检查堆栈。
【解决方案2】:

还有 dict

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

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

结果

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

【讨论】:

  • 不确定它是否和 copy() 一样快,但似乎比 deepcopy() 快。也许对于复杂的字典模式,它会接近 deepcopy() 因为 dict() 创建了一个新字典。
  • 仍然有效。 py3.8.5 mac os
【解决方案3】:

使用复制和深复制

http://docs.python.org/library/copy.html

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2013-03-27
    • 2019-03-29
    • 2020-12-06
    • 2019-11-07
    相关资源
    最近更新 更多