Python返回二维数组时所有行重复为最后一行的问题排查
问题根因
这是Python使用乘法创建嵌套列表时的典型浅拷贝引用问题:
- 代码中初始化二维数组的写法
T = [[0.0]*cols]*rows存在逻辑缺陷:外层的*rows操作不会生成rows个独立的子列表,只是把同一个子列表的内存地址复制了rows份。也就是说T[0]到T[rows-1]的所有行索引,指向的都是内存里完全相同的一个列表对象,修改任意一行的元素,所有行的对应位置都会同步改变。 - 函数内赋值时逐元素打印结果正确,是因为循环按i从0到size-1顺序执行,给
T[i][j]赋值后立刻打印当前值,此时刚写入的内容还没被后续循环覆盖,所以输出暂时正确。但i自增进入下一行赋值时,操作的还是那个共享的子列表,会直接把上一轮写入的前一行数据全部覆盖。 - 整个双重循环结束后,共享子列表里只保留了最后一轮i=size-1写入的最后一行数据,此时无论访问T的哪一个行索引,拿到的都是这份存了最后一行内容的列表,最终打印出来所有行就全是重复的最后一行。
修复方案
将嵌套乘法的初始化逻辑替换为列表推导式,保证每一行都是独立创建的新列表即可:
# 替换原有 T = [[0.0]*cols]*rows 写法 T = [[0.0 for _ in range(cols)] for _ in range(rows)]
补充说明:内层的
[0.0]*cols写法是安全的,因为0.0是不可变数值类型,复制不存在引用共享问题,问题仅出在外层对可变列表对象做乘法复制的操作。
内容的提问来源于stack exchange,提问作者gyuunyuu
相关产品推荐
相关产品推荐

