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

时间:2015-10-11 01:20:57

标签: 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
print(list2) #returns [[11,12],[0,14]], want to return [[1,2],[0,4]]

我在这里缺少一些基本的东西。我想通过声明list1=list2创建了一个新列表,其余的代码在保持list2不变的情况下进行了修改。

问题是什么,我该如何解决?

2 个答案:

答案 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)

<强>文档

进一步阅读