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

Python矩阵减法后原列表值异常:输出结果与原矩阵、矩阵2重复问题排查

矩阵减法中的浅拷贝问题及修复方案

你的代码核心问题出在Subraction函数的浅拷贝操作上,导致原数组被篡改、结果异常:

问题分析

result.extend(arr1)并没有创建arr1中行列表的独立副本,只是把这些行的引用添加到了result中。这意味着result的每一行和arr1的对应行是同一个内存对象——当你执行result[i][j] = arr1[i][j] - arr2[i][j]时,实际上是直接修改了arr1(也就是主程序里的A)的元素,引发了以下现象:

  • result和arr1值最终相同:二者共享行对象,修改result就是修改arr1
  • 原列表A的值被意外改变:因为arr1是A的引用,函数内的修改会直接影响外部变量
  • 打印结果混乱:A被篡改后,printmatrix输出的Matrix 1实际上已经变成了差值矩阵,容易和其他矩阵混淆

修复方案

修改Subraction函数,创建完全独立的新矩阵,避免引用共享:

修复后的完整代码

def matrixinput(a,b):
    arr = []
    for i in range(a):
        row = []
        for j in range(b):
            row.append(int(input()))
        arr.append(row)
    return arr
        
def printmatrix(a,b,c):
    print('Matrix 1')
    for i in a:
        for j in i:
            print(j , end = ' ')
        print()
    print('Matrix 2')
    for i in b:
        for j in i:
            print(j , end = ' ')
        print()
    print('Difference of Matrix')
    for x in c:
        for y in x:
            print(y , end = ' ')
        print()

def Subraction(arr1, arr2):
    result = []
    # 逐行创建新列表,存储差值,避免引用原数组行
    for i in range(len(arr1)):
        new_row = []
        for j in range(len(arr1[i])):
            new_row.append(arr1[i][j] - arr2[i][j])
        result.append(new_row)
    return result
    
a,b = int(input()), int(input())    
A = matrixinput(a,b)
B = matrixinput(a,b)
C = Subraction(A,B)
printmatrix(A,B,C)

简化版Subraction函数(用列表推导式)

如果追求简洁,也可以用嵌套列表推导式实现:

def Subraction(arr1, arr2):
    return [[arr1[i][j] - arr2[i][j] for j in range(len(arr1[i]))] for i in range(len(arr1))]

这样修改后,result的每一行都是全新的列表,和原数组A、B完全独立,执行减法操作不会影响原数组,打印结果也会符合预期。

内容的提问来源于stack exchange,提问作者Adhil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:21:35