无法使Python列表副本工作

Cannot make Python list copies to work

本问题已经有最佳答案,请猛点这里访问。

当我试图处理一个列表和它的副本时,我有一个问题。我知道在python中有一些复制列表的方法,我认为我遵循它们。这是我的问题。

1
2
3
4
5
6
7
8
9
10
11
a = []
for i in range(10):
    a.append([0]*10)

b = a[:]

for j in a:
    j[0] = 1

print a
print b

我创建一个空白列表。然后我添加10个子列表的零([0,0,0,0,0….])。然后复制列表,最后迭代第一个列表。但当我打印它们时,两个列表都被更改了。


您只创建了一个浅副本。这将创建一个引用所包含值的新列表。a中包含的列表仍在ab列表之间共享。

您可以添加复制级别:

1
b = [elem[:] for elem in a]

这将创建一个新的列表对象,其中包含来自a的嵌套列表的浅副本。因为嵌套列表本身只包含不可变的对象(整数),所以这里就足够了。

或者,您可以使用copy.deepcopy()让库函数为您执行此操作,通过在结构上递归并创建任何可变内容的副本来创建副本。


3种选择:

  • 将内置的list()函数与生成器结合使用

b = list(list(item) for item in a)

  • 列表理解

b = [item[:] for item in a]

  • 通用拷贝.deepcopy()。

import copy
b = copy.deepcopy(a)


创建深度拷贝的另一种方法是使用copy模块的copy.deepcopy功能:doc


要正确复制,请使用copy模块

1
b = copy.deepcopy(a)