Python 通过旧列表修改列表副本的错误

Python 通过旧列表修改列表副本的错误,python,list,debugging,Python,List,Debugging,我在python中使用矩阵,在花了数小时调试一个程序后,设法将问题追踪到这段代码中,在这段代码中,矩阵的所有非零项都均匀地增加 list2=[[1,2],[0,4]] list1=list2 for row in list1: for i in range(0,len(row)): if row[i]!=0: row[i]=row[i]+10 print(list1) #returns [[11,12],[0,14]], as expected p

我在python中使用矩阵,在花了数小时调试一个程序后,设法将问题追踪到这段代码中,在这段代码中,矩阵的所有非零项都均匀地增加

list2=[[1,2],[0,4]]
list1=list2
for row in list1:
    for i in range(0,len(row)):
        if row[i]!=0:
            row[i]=row[i]+10
print(list1) #returns [[11,12],[0,14]], as expected
print(list2) #returns [[11,12],[0,14]], want to return [[1,2],[0,4]]
我这里缺少一些基本的东西。我认为通过声明
list1=list2
创建了一个新的列表,其余的代码在保持
list2
不变的同时对其进行了修改

问题出在哪里?如何解决它?

此代码:

list2=[[1,2],[0,4]]
list1=list2
不在
list1
中创建新列表,它只是将名称
list1
绑定到与
list2
相同的对象。因此,通过名称
list2
对列表所做的任何更改也将通过
list1
可见

您可以使用以下模块:

list1
现在将引用
list2
的副本,对列表的更改将仅通过
list2
反映出来

对于包含更复杂对象(如其他列表)的列表,
copy.deepcopy()
将对嵌套对象进行递归复制。

问题;您没有复制实际的列表 通过执行
list1=list2
您只是将句柄复制到
list1
所引用的列表中,为了提供实际副本,您必须明确地说这是您想要的

示例


解决方案;一路抄袭 您遇到的问题将显示在其他位置,因为您在列表中有列表。为了一次生成一个深度副本,建议使用,如下例所示

import copy
文档


进一步阅读

从副本导入deepcopy;list1=deepcopy(list2)可能是我刚刚尝试过的更改的副本,但它仍然返回
[[11,12],[0,14]
list1=list2[:]
是一个肤浅的副本。太棒了,我永远不会明白这一点。在uni上了一整门关于python的课程,但在任何阶段都没有提到这一点。
a = [1,2,3];
b = a
c = list(a) # create a new list, copying the elements in `a`
d = a[:]    # equivalent to `list(a)` (with a slightly weird syntax)
a[1] = 99
c[1] = 0
print (a) # [1,99,3]
print (b) # [1,99,3]
print (c) # [1,0,3]
print (d) # [1,2,3]
import copy
list1 = copy.deepcopy (list2)