如何深度复制复制字典列表?

How to deep copy duplicate a list of dictionaries?

我有一个字典列表:

my_list = [
  {
    'key1': 'value1',
  },
  {
    'key2': 'value2',
  },
]

我想像这样乘以列表:

my_new_list = [
  {
    'key1': 'value1',
  },
  {
    'key2': 'value2',
  },
  {
    'key1': 'value1',
  },
  {
    'key2': 'value2',
  },
]

我尝试了 my_list * 2 方法,但它会创建浅拷贝,这意味着如果我修改一个字典,它最终会修改列表中的许多其他字典。我想我正在寻找深拷贝。

我也试过这个:

my_new_list = [my_list[i % len(my_list)] for i in range(4)]

但同样的问题。

这种方法奏效了,但我觉得它不是很 pythonic,这就是为什么我正在寻找更好的答案。

from copy import deepcopy

my_new_list = [deepcopy(my_list[i % len(my_list)]) for i in range(4)]

我如何创建这个深拷贝乘法列表?

只需使用 dict.copy() 方法创建 dict 对象的文字副本。

my_new_list = [my_list[i % len(my_list)].copy() for i in range(len(my_list) * 2)]

现在让我们更改第一个 dict 对象的值来验证,

my_new_list[0]['key1'] = 'value3'
print(my_new_list)

输出:

[{'key1': 'value3'}, {'key2': 'value2'}, {'key1': 'value1'}, {'key2': 'value2'}]

你可以使用乘法方法 dict.copy() 假设你的 dicts 像你的例子中的那样浅。

l = [{'k1': 'v1'}, {'k2': 'v2'}]

result = [d.copy() for d in l * 2]
result[0]['k1'] = 'changed'
print(result)
# [{'k1': 'changed'}, {'k2': 'v2'}, {'k1': 'v1'}, {'k2': 'v2'}]

这个怎么样?在我看来非常 pythonic...

my_list.extend(deepcopy(my_list))

这当然会覆盖 my_list。如果你想保留它,只需预先将 my_list 深度复制到 my_new_list(或执行添加两个 my_list 的深度复制)。

这种方式应该适用于任何对象(可以深度复制),而不是依赖于 dict 定义的行为

可以使用copy模块进行深拷贝, 试试这个

import copy
my_list = [{'key1': 'value1',},{'key2': 'value2',},]
my_list = my_list + copy.deepcopy(my_list)
my_list[0]['key1'] = 'next'
print(my_list)

我正在努力解决为什么原始发帖人的解决方案被视为 "not pythonic." 你真的需要一个理由来乱扔那个标签。但是看看他们的模算术答案,我猜这不仅仅是将列表加倍,而是将其用作重复模板以将新列表填充到任意大小。

from copy import deepcopy
from itertools import islice, cycle
def fill(iterable, size):
    return map(deepcopy, islice(cycle(iterable), size))

print (list(fill(my_list, 4)))

itertools.cycle 给你重复行为
itertools.islice 让您指定元素的数量
deepcopy 是为了可重用性,以防个别 dicts 的内部数据在浅拷贝中可能不安全(与发布的示例不同)——因为它在问题标题中。
map 让我 return 可以迭代 deepcopy 结果,所以如果你想要一个列表,你可以拥有它,但你可以随心所欲地使用它。

郑重声明,我对模运算解决方案很满意。数学仍然适用于 python!