如何深度复制重复的词典列表?

时间:2019-08-28 16:52:00

标签: python deep-copy

我有一些字典:

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)]

但同样的问题。

这种方法行得通,但对我来说却不是很Python,这就是为什么我在寻找更好的答案。

from copy import deepcopy

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

如何创建深拷贝副本列表?

5 个答案:

答案 0 :(得分:2)

您可以将乘法与dict.copy()一起使用,假设您的字典像您的示例一样浅。

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'}]

答案 1 :(得分:1)

您可以使用复制模块进行深层复制, 试试这个

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

答案 2 :(得分:0)

只需使用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'}]

答案 3 :(得分:0)

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

my_list.extend(deepcopy(my_list))

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

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

答案 4 :(得分:0)

我正为为什么原始海报的解决方案被视为“非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可让您指定元素数
深度复制用于可重用性,以防单个字典具有内部数据,而内部数据在浅表副本中可能并不安全(与所发布的示例不同),并且因为它位于问题标题中。
map让我返回了深度拷贝结果的可迭代结果,因此,如果您想要一个列表,可以拥有它,但是可以随意使用它。

记录下来,我对模算术解决方案感到满意。数学仍然可以在python中工作!