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

时间:2019-03-19 12:20:08

标签: python list

如何复制由列表类型元素组成的列表?我使用了类似问题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]仅适用于单个嵌套级别。对于更复杂的深层复制,请查找短语“深层复制”。感谢您的所有帮助。

3 个答案:

答案 0 :(得分: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)

输出

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

答案 1 :(得分: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(),列表中的列表也将被复制。

输出:

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

输出:

False
False
False

答案 2 :(得分:-2)

import copy
....
b = copy.copy(a)
...