Python任意阶矩阵乘法代码报错:'int'对象不可下标访问,求排查修复
矩阵乘法代码报错修复:'int' object is not subscriptable
问题分析
- 结果矩阵初始化错误:原代码中
ResultMatrix = ([0]*col_B)*row_A的写法存在本质问题。在Python中,([0]*col_B)*row_A会将一维列表[0]*col_B重复row_A次,最终生成的是一维列表(比如row_A=2、col_B=2时,结果为[0,0,0,0])。当尝试访问ResultMatrix[i][j]时,ResultMatrix[i]是整数0,无法进行下标访问,从而触发'int' object is not subscriptable错误。 - 行列数计算冗余:原代码通过循环计数行列数完全没必要,直接用
len()函数即可快速获取矩阵的行、列数。 - 相乘条件判断冗余:原代码
if (col_A > row_B) or (col_A < row_B)等价于if col_A != row_B,可简化写法让逻辑更清晰。
修复后的代码
def MatrixMatrixMultiply(A, B): # 高效获取矩阵行列数,增加空矩阵判断避免索引错误 row_A = len(A) col_A = len(A[0]) if row_A > 0 else 0 row_B = len(B) col_B = len(B[0]) if row_B > 0 else 0 # 判断矩阵是否满足相乘条件 if col_A != row_B: return "Error! Multiplication is not possible" # 正确初始化二维结果矩阵:每行都是独立的新列表 ResultMatrix = [[0 for _ in range(col_B)] for _ in range(row_A)] # 矩阵乘法核心计算逻辑 for i in range(row_A): for j in range(col_B): for k in range(col_A): ResultMatrix[i][j] += A[i][k] * B[k][j] return ResultMatrix # 测试用例 A = [[1,2,3],[4,5,6]] B = [[7,8],[9,10],[11,12]] print(MatrixMatrixMultiply(A,B))
关键修改说明
- 结果矩阵初始化:改用列表推导式
[[0 for _ in range(col_B)] for _ in range(row_A)],确保每行都是独立的新列表,既避免了引用重复问题,又正确创建了二维矩阵结构。 - 行列数获取:用
len(A)直接获取A的行数,len(A[0])获取A的列数,同时增加空矩阵判断,防止空矩阵场景下的索引错误。 - 条件判断简化:直接判断
col_A != row_B,逻辑更直观简洁。
内容的提问来源于stack exchange,提问作者Guy Weizman
相关产品推荐
相关产品推荐

