我正在使用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
不变的情况下进行了修改。
问题是什么,我该如何解决?
答案 0 :(得分:2)
此代码:
list2=[[1,2],[0,4]]
list1=list2
不在list1
中创建新列表,它只是将名称list1
绑定到与list2
相同的对象。因此,通过list2
也可以看到通过名称list1
对列表所做的任何更改。
您可以使用copy
模块:
import copy
list2 = [[1,2],[0,4]]
list1 = copy.deepcopy(list2)
list1
现在会引用list2
的副本,对列表的更改只会通过list2
反映出来。
对于包含更复杂对象(如其他列表)的列表,copy.deepcopy()
将生成嵌套对象的递归副本。
答案 1 :(得分:2)
通过执行list1 = list2
,您只是将句柄复制到list1
所指的列表中,为了提供实际副本,您必须说这是什么你想要 - 明确地。
<子> 示例强> 子>
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]
由于您在列表中有列表,因此您遇到的问题会显示在其他位置。为了一次性制作深副本,建议使用copy.deepcopy,如下例所示。
import copy
list1 = copy.deepcopy (list2)
<强>文档强>