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