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

Python基础矩阵转置实现异常,求问题原因与解决方法

你的矩阵转置代码出问题的原因及修复方案

咱们先拆解你代码里的两个核心问题:

1. 列表赋值只是引用传递,没有创建新矩阵

你写了B = A,但在Python里,列表是可变对象,这行代码并没有复制整个矩阵,只是让B和A指向了同一个内存里的列表。所以当你修改A[i][j]的时候,B[j][i]也会跟着变——因为它们根本就是同一个东西!后面的赋值操作用的已经是被修改过的数据,自然得不到正确结果。

2. 原地修改整个矩阵会导致数据覆盖

你用两层循环遍历了所有i和j,这意味着你会重复修改元素。比如当i=0,j=1时,你把A[0][1]改成了原A[1][0](也就是2),但等到i=1,j=0时,你要取的B[0][1]已经变成2了(因为B和A是同一个),而不是原来的1,这就导致后面的赋值全乱了。

修复方案一:创建新矩阵(推荐,不破坏原数据)

最稳妥的方式是生成一个全新的转置矩阵,完全不修改原矩阵:

A = [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]

def transpose(matrix):
    # 列表推导式:按列取元素生成新行
    return [[matrix[j][i] for j in range(len(matrix))] for i in range(len(matrix[0]))]

# 获取转置后的矩阵
transposed_A = transpose(A)

# 打印结果
for row in transposed_A:
    print(' '.join(map(str, row)))

运行这段代码会得到正确的转置结果:

1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4

修复方案二:原地转置(仅适用于方阵)

如果你一定要在原矩阵上修改(只适合行数等于列数的方阵),那只需要遍历矩阵的上三角部分(避免重复交换):

A = [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]

def in_place_transpose(matrix):
    n = len(matrix)
    for i in range(n):
        # 只遍历j > i的位置,交换matrix[i][j]和matrix[j][i]
        for j in range(i + 1, n):
            matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

in_place_transpose(A)

# 打印修改后的原矩阵
for row in A:
    print(' '.join(map(str, row)))

这个方法不会重复修改元素,也不需要额外的矩阵拷贝,同样能得到正确结果。

为什么你会得到那个奇怪的结果?

咱们拆解一下你代码的执行过程:

  • 当i=0时,循环j从0到3,把A[0]的元素依次改成B[0][0](1)、B[1][0](2)、B[2][0](3)、B[3][0](4),此时A变成[[1,2,3,4], [2,2,2,2], [3,3,3,3], [4,4,4,4]]
  • 当i=1时,j=0时要取B[0][1],但B和A是同一个,所以这个值已经是2了,A[1][0]还是2;j=2时取B[2][1](3),把A[1][2]改成3;j=3时取B[3][1](4),把A[1][3]改成4
  • 后面的循环以此类推,最终就得到了你看到的那个半转置的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:43:05