将result矩阵设为输入矩阵时,N×N矩阵转置结果错误
问题分析:矩阵转置中直接赋值原矩阵导致错误的原因
核心问题出在Python的列表引用机制上:
当你写result = matrix时,并没有创建一个新的矩阵,而是让result和matrix指向内存中同一个二维列表对象。也就是说,两者是同一个东西的不同名字,修改其中一个,另一个会同步变化。
结合你的例子拆解错误过程
假设你的转置逻辑是类似这样的:
n = 2 matrix = [[1,2], [3,4]] result = matrix for i in range(n): for j in range(n): result[j][i] = matrix[i][j]
执行过程中会出现以下问题:
- 当
i=0, j=1时,执行result[1][0] = matrix[0][1],也就是把result(同时也是matrix)的第二行第一列改成2。此时原矩阵已经变成了[[1,2], [2,4]]。 - 后续
i=1, j=0时,取matrix[1][0]的值已经不是原来的3,而是被修改后的2,所以赋值给result[0][1]后,最终得到错误的[1,2], [2,4]。
而你最初用列表推导式result=[[0 for i in range(len(matrix))] for j in range(len(matrix))]创建的是全新的独立矩阵,每个子列表都是重新生成的,和原matrix没有关联,所以修改result时不会影响原矩阵的值,转置逻辑就能正常执行。
解决方法
如果不想用全0初始化,你可以创建原矩阵的深拷贝,确保result是独立对象:
- 方法1:列表推导式生成拷贝
result = [row.copy() for row in matrix] - 方法2:用
copy模块的深拷贝(适合更复杂的嵌套结构)import copy result = copy.deepcopy(matrix)
内容的提问来源于stack exchange,提问作者Flying_Zues
相关产品推荐
相关产品推荐

