E0_copy = list(E0)后,我猜E0_copy是E0的深度拷贝,因为id(E0)不等于id(E0_copy)。然后我在循环中修改了E0_copy,但是为什么E0之后不一样了?

E0 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for k in range(3):
    E0_copy = list(E0)
    E0_copy[k][k] = 0
    #print(E0_copy)
print E0  # -> [[0, 2, 3], [4, 0, 6], [7, 8, 0]]

当前回答

如果你的列表元素是不可变对象,那么你可以使用这个,否则你必须从copy模块中使用deepcopy。

你也可以使用最短的方法来深度复制列表,就像这样。

a = [0,1,2,3,4,5,6,7,8,9,10]
b = a[:] #deep copying the list a and assigning it to b
print id(a)
20983280
print id(b)
12967208

a[2] = 20
print a
[0, 1, 20, 3, 4, 5, 6, 7, 8, 9,10]
print b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10]

其他回答

如果你的列表元素是不可变对象,那么你可以使用这个,否则你必须从copy模块中使用deepcopy。

你也可以使用最短的方法来深度复制列表,就像这样。

a = [0,1,2,3,4,5,6,7,8,9,10]
b = a[:] #deep copying the list a and assigning it to b
print id(a)
20983280
print id(b)
12967208

a[2] = 20
print a
[0, 1, 20, 3, 4, 5, 6, 7, 8, 9,10]
print b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10]

只是一个递归的深度复制函数。

def deepcopy(A):
    rt = []
    for elem in A:
        if isinstance(elem,list):
            rt.append(deepcopy(elem))
        else:
            rt.append(elem)
    return rt

编辑:正如Cfreak提到的,这已经在复制模块中实现了。

下面是一个深度复制2D列表的例子:

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

如果你使用deepcopy给同一个列表赋值, 请使用临时变量。由于某些原因,copy.deepcopy()在尝试使用索引自我更新同一变量时,在对象列表上不起作用

S = S[idx] ->x
S = copy.deepcopy(S[idx])  -> x

VVVV,虽然这工作

Stemp = np.zeros(N,dtype=object)
for ii in range(N):
   Stemp[ii]=copy.deepcopy(S[idx[ii]])
S= copy.deepcopy(Stemp)

如果列表的内容是基本数据类型,则可以使用理解式

new_list = [i for i in old_list]

你可以为多维列表嵌套它,比如:

new_grid = [[i for i in row] for row in grid]