Python 通过旧列表修改列表副本的错误
我在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
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
文档
进一步阅读
[[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)