我在 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
中创建新列表,它只是绑定(bind)名称 list1
与 list2
相同的对象。因此,通过名称 list2
对列表进行的任何更改也可以通过 list1
看到.
您可以使用 copy
模块:
import copy
list2 = [[1,2],[0,4]]
list1 = copy.deepcopy(list2)
list1
现在将引用 list2
的副本对列表的更改将仅通过 list2
反射(reflect).
对于包含更复杂对象的列表(例如其他列表),copy.deepcopy()
将递归复制嵌套对象。
关于python - 通过旧列表修改列表副本的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33060654/