这个问题在这里已有答案:
如何复制由列表类型元素组成的列表?我使用了类似问题how to clone a list?中描述的方法但是它仍然无效,如下图所示
原始代码是
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”。感谢你的帮助。
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
使用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]]
import copy
....
b = copy.copy(a)
...