【问题标题】:Strange behavior by list of dictionaries [duplicate]字典列表的奇怪行为[重复]
【发布时间】:2021-02-27 06:44:01
【问题描述】:

我有一个字典列表如下:

a = [{'a':1, 'b':2, 'c':3}, {'d':4, 'e':5, 'f':6}]

现在我希望另一个列表 b 具有与 a 相同的内容,但多了一个 (key,value) 对。所以我这样做:

b = a.copy()
for item in b:
  item['x'] = 6

但现在ab 列表中都有'x': 6

>>> b
[{'a': 1, 'b': 2, 'c': 3, 'x': 6}, {'d': 4, 'e': 5, 'f': 6, 'x': 6}]
>>> a
[{'a': 1, 'b': 2, 'c': 3, 'x': 6}, {'d': 4, 'e': 5, 'f': 6, 'x': 6}]

我也试过这个:

c = a[:]
for item in c:
  item['q'] = 12

现在这三个列表都有'q': 12

>>> c
[{'a': 1, 'b': 2, 'c': 3, 'x': 6, 'q': 12}, {'d': 4, 'e': 5, 'f': 6, 'x': 6, 'q': 12}]
>>> b
[{'a': 1, 'b': 2, 'c': 3, 'x': 6, 'q': 12}, {'d': 4, 'e': 5, 'f': 6, 'x': 6, 'q': 12}]
>>> a
[{'a': 1, 'b': 2, 'c': 3, 'x': 6, 'q': 12}, {'d': 4, 'e': 5, 'f': 6, 'x': 6, 'q': 12}]

我不明白这是如何工作的。如果我做了b = a,这是可以接受的。但是为什么是b = a.copy()c = a[:]

提前致谢:)

【问题讨论】:

  • - 浅拷贝构造一个新的复合对象,然后(尽可能)将与原始对象包含的相同对象插入其中。
  • - 深拷贝构造一个新的复合对象,然后递归地将在原始对象中找到的副本插入其中。
  • ^^ 来自文档。您可以在 python shell 中通过help(copy) 快速访问它

标签: python-3.x list dictionary


【解决方案1】:

要复制字典并复制所有引用的对象,请使用 copy 模块中的 deepcopy() 函数,而不是 dict 的方法 copy()

import copy
a = [{'a':1, 'b':2, 'c':3}, {'d':4, 'e':5, 'f':6}]
b = copy.deepcopy(d)

【讨论】:

  • 谢谢。这肯定有效,但我想知道为什么我正在做的方法不起作用:)
  • 我编辑了它,但由于它还没有被批准,所以复制字典会复制字典的引用。它引用的对象是相同的对象,你需要做一个深拷贝来复制引用的对象。
【解决方案2】:

您可以使用@maziyank 的解决方案。解释是除了copy.deepcopy() 之外的所有方法都只是将一个变量指向前一个变量。 因此,对其中任何一个的任何更改都将超越指向同一变量的所有变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    相关资源
    最近更新 更多