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

如何修复类使用中的语法错误与未定义错误?矩阵sub方法报错排查

解决矩阵减法方法的"name 'sub' is not defined"错误及代码修复

看起来你碰到了两个问题:一是Python找不到sub方法的定义,二是现有的sub方法本身存在逻辑bug,我们一步步来解决。

一、先解决"name 'sub' is not defined"的问题

这个错误通常有两种常见原因:

  • 原因1:sub方法没有正确属于你的矩阵类
    确保你的sub方法是缩进在矩阵类的内部,比如你的类结构应该是这样的:

    class Matrix:
        def __init__(self, elements):
            self.elements = elements
            self.rows = len(elements)
            self.cols = len(elements[0]) if self.rows > 0 else 0
    
        # 把sub方法放在类里面,缩进和__init__保持一致
        def sub(self, other):
            # 你的方法代码
    

    如果把sub写在了类的外面,Python就会把它当成独立函数,而你如果是用matrix1.sub(matrix2)调用的话,就会找不到方法;反过来如果是独立函数却用实例调用,也会报错。

  • 原因2:调用方式错误
    因为sub是实例方法(带self参数),你需要通过矩阵实例来调用它,比如:

    mat1 = Matrix([[1,2],[3,4]])
    mat2 = Matrix([[5,6],[7,8]])
    result = mat1.sub(mat2)  # 正确调用方式
    # 而不是直接调用 sub(mat1, mat2),这会报"name 'sub' is not defined"
    

二、修复sub方法的逻辑bug

你的现有代码有两个关键问题,导致即使方法能找到,结果也不对:

  1. 行列遍历顺序搞反了:你外层循环遍历的是cols,内层是rows,但矩阵的行是self.rows(对应elements的外层列表长度),列是self.cols(对应每个子列表的长度),所以应该外层遍历行,内层遍历列。
  2. 没有将每行的结果添加到结果矩阵中:你创建了matrix3存储每行的减法结果,但没有把它追加到subtraction_matrix里,最后返回的是空列表。
  3. 维度不匹配时返回空列表不够合理:更好的做法是抛出ValueError,明确告知调用者维度不匹配的错误。

修复后的代码如下:

def sub(self, other):
    if self.cols != other.cols or self.rows != other.rows:
        raise ValueError("矩阵维度不匹配,无法进行减法运算")
    subtraction_matrix = []
    # 外层遍历行
    for i in range(self.rows):
        row_result = []
        # 内层遍历列
        for j in range(self.cols):
            row_result.append(self.elements[i][j] - other.elements[i][j])
        # 将每行结果添加到最终矩阵
        subtraction_matrix.append(row_result)
    return subtraction_matrix

测试示例

你可以用下面的代码测试修复后的方法:

class Matrix:
    def __init__(self, elements):
        self.elements = elements
        self.rows = len(elements)
        self.cols = len(elements[0]) if self.rows > 0 else 0

    def sub(self, other):
        if self.cols != other.cols or self.rows != other.rows:
            raise ValueError("矩阵维度不匹配,无法进行减法运算")
        subtraction_matrix = []
        for i in range(self.rows):
            row_result = []
            for j in range(self.cols):
                row_result.append(self.elements[i][j] - other.elements[i][j])
            subtraction_matrix.append(row_result)
        return subtraction_matrix

# 测试
mat_a = Matrix([[10, 20], [30, 40]])
mat_b = Matrix([[5, 5], [5, 5]])
print(mat_a.sub(mat_b))  # 应该输出 [[5,15],[25,35]]

这样应该就能解决你的错误,同时得到正确的矩阵减法结果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:49:54