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

标签 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 不变。

问题是什么,如何解决?

最佳答案

这段代码:

list2=[[1,2],[0,4]]
list1=list2

是否没有list1 中创建新列表,它只是绑定(bind)名称 list1list2 相同的对象。因此,通过名称 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/

相关文章:

python - 在 if 语句中使用别名

python - 使用 matplotlib 和 ipywidget 的交互式图形

python:使用remove()按值从列表中删除元素

javascript - WebStorm Async Await 调试 Node.js Sails.js

python - tensorflow /keras神经网络中的过拟合和数据泄漏

javascript - 将值推送到 jquery 中的数组

python - 从列表创建多维列表

linux - 如何配置 ddd 以使用另一个 gdb 而不是默认 gdb

debugging - 在 GDB 中调试内核时如何正确键入内存指令/操作码以写入/修改内存地址

python - 删除或编辑 admin.TabularInline 中的对象名称