如何在python中克隆或复制元素为list的列表? [重复]

问题描述 投票:0回答:3

这个问题在这里已有答案:

如何复制由列表类型元素组成的列表?我使用了类似问题how to clone a list?中描述的方法但是它仍然无效,如下图所示output of the original code

原始代码是

asd
a = [[]]
b = list(a)
for i in [1,2]:
    for j in b:
        j.append(i)
    print a

a被改变时,为什么b会改变?但我想保持a不被改变。

要求:因为我在leetcode.com中遇到了这个问题,所以无法导入copy等软件包。


最后,答案是我需要列表的深层副本,即b = [c[:] for c in a]。注意:正如@ PM2Ring在评论区域中提到的那样,b = [c[:] for c in a]仅适用于单级嵌套。对于更复杂的深层复制,请查找短语“deep copy”。感谢你的帮助。

python list
3个回答
1
投票
import copy

lis = [[1], [2]]

deep_list = copy.deepcopy(lis)
copy_list = copy.copy(lis)

print(deep_list is lis)
print(deep_list[0] is lis[0])
print(deep_list[1] is lis[1])

print(copy_list is lis)
print(copy_list[0] is lis[0])
print(copy_list[1] is lis[1])

在上面的代码中,deepcopy()创建了list的深层副本,因此您和copy()创建了一个浅层副本。如果是deepcopy(),列表中的列表也将被复制。

OUTPUT:

False
False
False
False
True
True

编辑:既然你不能导入库也许你可以尝试以下方法:

lis = [[1], [2]]

deep_list = []

for item in lis:
    deep_list.append(item[:])

print(deep_list is lis)
print(deep_list[0] is lis[0])
print(deep_list[1] is lis[1])

OUTPUT:

False
False
False

2
投票

使用copy

import copy

a = [[]]
b = copy.copy(a)    # b = a[:] using slicing is a lot faster
for i in [1,2]:
    for j in b:
        j.append(i)
print(a)
print(b)

没有包,使用slicing

a = [[]]
b = a[:]        # b = a.copy() Could also come in handy
for i in [1,2]:
    for j in b:
        j.append(i)
print(a)
print(b)

OUTPUT:

[[1, 2]]
[[1, 2]]

-2
投票
import copy
....
b = copy.copy(a)
...
© www.soinside.com 2019 - 2024. All rights reserved.