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

矩阵转置后所有行均与最后一行相同的代码问题排查求助

矩阵转置代码问题排查

问题现象

用静态初始值创建空白二维矩阵时,能得到正确的转置结果;但用for循环创建空白矩阵时,返回的转置结果中所有行均与最后一行相同。

矩阵示例

  • 原始矩阵:
[[1, 2, 3], 
[4, 5, 6], 
[7, 8, 9]]
  • 预期转置结果:
[[1, 4, 7],
[2, 5, 8],
[3, 6, 9]]
  • 实际错误结果:
[[3, 6, 9],
[3, 6, 9],
[3, 6, 9]]

原代码

def transpose_mtx(original):
    t_cols = len(original)
    t_rows = len(original[0])

    # 创建指定形状的空白零矩阵(错误写法)
    row = [0 for _ in range(t_cols)]
    t_mtx = [row for _ in range(t_rows)]

    # t_mtx = [[0,0,0],[0,0,0], [0,0,0]]
    # 换成这行静态初始化就能得到正确结果
 
    # 遍历原始矩阵的行
    for i in range(len(original)):
        # 遍历原始矩阵的列
        for j in range(len(original[0])):
            # 交换元素位置完成转置
            t_mtx[j][i] = original[i][j]
    
    return t_mtx


my_mtx = [[1,2, 3],
          [4, 5, 6],
          [7, 8, 9]]

print(transpose_mtx(my_mtx))

问题根源

你用[row for _ in range(t_rows)]创建矩阵时,所有行其实都是同一个列表对象的引用。因为row是一个列表变量,循环里只是把这个变量的引用重复添加到t_mtx里,所以修改任何一行的元素,都会同步改变所有行。而静态初始化的[[0,0,0],[0,0,0], [0,0,0]]是分别创建了三个独立的列表,彼此之间没有关联。

修复方案

只需要修改空白矩阵的创建方式,确保每一行都是独立的新列表:

方法1:嵌套列表推导式(推荐)

t_mtx = [[0 for _ in range(t_cols)] for _ in range(t_rows)]

方法2:复制现有行

如果要保留row的定义,可以每次循环时复制row:

row = [0 for _ in range(t_cols)]
t_mtx = [row.copy() for _ in range(t_rows)]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:35:01