矩阵转置后所有行均与最后一行相同的代码问题排查求助
矩阵转置代码问题排查
问题现象
用静态初始值创建空白二维矩阵时,能得到正确的转置结果;但用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
相关产品推荐
相关产品推荐

