Python 如何深度复制词典列表?

Python 如何深度复制词典列表?,python,deep-copy,Python,Deep Copy,我有一个目录: my_list = [ { 'key1': 'value1', }, { 'key2': 'value2', }, ] 我想将列表乘以如下所示: my_new_list = [ { 'key1': 'value1', }, { 'key2': 'value2', }, { 'key1': 'value1', }, { 'key2': 'value2', }, ] 我尝试了my_li

我有一个目录:

my_list = [
  {
    'key1': 'value1',
  },
  {
    'key2': 'value2',
  },
]
我想将列表乘以如下所示:

my_new_list = [
  {
    'key1': 'value1',
  },
  {
    'key2': 'value2',
  },
  {
    'key1': 'value1',
  },
  {
    'key2': 'value2',
  },
]
我尝试了
my_list*2
方法,但它创建了浅拷贝,这意味着如果我修改一个dict,它最终会修改列表中的许多其他dict。我想我在找一份深度副本

我也试过:

my_new_list=[my_list[i%len(my_list)],适用于范围(4)内的i]

但同样的问题

这种方法很管用,但对我来说并不是很好,这就是为什么我在寻找一个更好的答案

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'
输出:

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

您可以将乘法方法与
dict.copy()
结合使用,假设您的dict与示例中的dict一样肤浅

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

这个怎么样?对我来说似乎很像蟒蛇

my_list.extend(deepcopy(my_list))
当然,这将覆盖
myu列表
。如果您想保留它,只需事先将
my_list
深度复制到
my_new_list
(或者添加两个
my_list
)即可


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

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

我一直在苦苦思索为什么原始海报的解决方案被认为是“不是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是为了可重用性,以防单个dict在浅拷贝中具有可能不安全的内部数据(与发布的示例不同)——并且因为它在问题标题中。
map允许我返回deepcopy结果的一个iterable,所以若你们想要一个列表,你们可以拥有它,但你们可以随意使用它


作为记录,我对模算术解很满意。数学在python中仍然有效

我的新列表=deepcopy(我的列表)+deepcopy(我的列表),它使用deepcopy,并给出您所要求的顺序。这可能很危险。我们不知道所有的dict对于浅层复制都是安全的,只是OP中介绍的dict。我很确定“pythonic”关注点是关于使用模算术技巧(我个人和大多数人一样对此很满意),而不是关于使用python附带的库是否是“pythonic”的问题,你仍然想要深度复制,因为我们不知道这些格言中到底是什么,但除此之外,这是可行的,而且可能更好,因为它可以通过列表理解构建新的列表。@KennyOstrom-评论不错。在答案中添加了注释,以避免读者混淆。好吧,你不必这样做。
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)))