propigate()函数意外修改原矩阵mappp,求问题排查与解决
二维矩阵处理时原矩阵意外被修改的修复方案
问题核心原因
- 浅拷贝未切断子列表引用:你用的
matrix.copy()是浅拷贝,只会复制外层列表,里面的每一行(子列表)仍和原矩阵mappp的行共用内存地址——修改mapp1degree里的元素,本质上改动的还是原矩阵的子列表。 add_twoList函数漏写返回值:这个函数生成了计算结果res_lt但未返回,导致你执行mapp1degree[idy] = add_twoList(...)时,矩阵行会被赋值为None,属于隐性逻辑错误。- 函数直接依赖全局变量
mappp,不仅降低了函数的健壮性,还可能在后续迭代中引发其他不可控问题。
分步修复
1. 用深拷贝替代浅拷贝
将浅拷贝改为深拷贝,彻底断开与原矩阵的所有引用关联:
import copy mapp1degree = copy.deepcopy(matrix) # 不想导入模块的话,也可以手动逐行拷贝: # mapp1degree = [row.copy() for row in matrix]
2. 补全add_twoList的返回语句
没有返回值的函数默认返回None,会导致矩阵行数据丢失,必须添加返回语句:
def add_twoList(L1, L2): res_lt = [] for x in range(len(L1)): res_lt.append(L1[x] * L2[x]) return res_lt # 关键:返回计算后的列表
3. 替换全局变量为参数引用
把函数内的mappp[i]改为基于传入矩阵的原始行数据,避免依赖全局变量:
def propigate(matrix): import copy mapp1degree = copy.deepcopy(matrix) # 预先保存原始矩阵的拷贝,确保计算用的是初始行数据 original_rows = copy.deepcopy(matrix) for idy, row in enumerate(mapp1degree): holder = [] for idx, element in enumerate(row): if element == 1: mapp1degree[idy][idx] = 0 holder.append(idx) print(holder) for i in holder: # 用预先保存的原始行,而非全局变量 mapp1degree[idy] = add_twoList([-1 * x for x in mapp1degree[-1]], original_rows[i]) return mapp1degree
验证效果
调用函数后,原矩阵mappp不会被修改,同时能得到预期结果:
mappp = [[0,-1,1,1,-1], [-1,0,1,-1,1], [1,1,0,-1,-1], [1,-1,-1,0,-1], [-1,1,-1,-1,0] ] result = propigate(mappp) # 打印原矩阵确认未被修改 print(mappp) # 打印结果矩阵 print(result)
内容的提问来源于stack exchange,提问作者oscar
相关产品推荐
相关产品推荐

