You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

propigate()函数意外修改原矩阵mappp,求问题排查与解决

二维矩阵处理时原矩阵意外被修改的修复方案

问题核心原因

  1. 浅拷贝未切断子列表引用:你用的matrix.copy()是浅拷贝,只会复制外层列表,里面的每一行(子列表)仍和原矩阵mappp的行共用内存地址——修改mapp1degree里的元素,本质上改动的还是原矩阵的子列表。
  2. add_twoList函数漏写返回值:这个函数生成了计算结果res_lt但未返回,导致你执行mapp1degree[idy] = add_twoList(...)时,矩阵行会被赋值为None,属于隐性逻辑错误。
  3. 函数直接依赖全局变量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:47:46