Python中如何在函数内修改外部矩阵变量以实现矩阵转置(不使用导入工具)
Python中如何在函数内修改外部矩阵变量以实现矩阵转置(不使用导入工具)
嘿,我完全懂你踩的这个坑!你之前的问题核心在于:当你在函数里写matrix = []的时候,其实是在函数内部创建了一个新的局部变量,和你外面传进来的原矩阵彻底断开了联系——后面所有操作都是在这个新变量上折腾,原矩阵当然纹丝不动啦。
咱们来一步步解决这个问题,分两种实用思路给你讲:
思路1:保留你原有的转置逻辑,修改原列表内容
你原来生成转置矩阵的代码是对的,只是最后一步搞错了——不要重新赋值matrix,而是直接修改原列表的内容:
def transpose(matrix: list): # 先按你的方法生成转置后的新矩阵 newmatrix = [] for r in range(len(matrix)): temp = [] for c in range(len(matrix)): temp.append(matrix[c][r]) newmatrix.append(temp) # 关键操作:不要重新赋值matrix,而是修改原列表 matrix.clear() # 清空原矩阵的所有元素(这是在原对象上操作) for row in newmatrix: matrix.append(row) # 把转置后的行添加回原矩阵 print(matrix) #1 这里打印的是修改后的原矩阵 matrix = [[1,2,3],[4,5,6],[7,8,9]] transpose(matrix) print(matrix) #2 现在这里也会打印转置后的结果啦!
为什么这样有效?因为clear()和append()都是在原列表对象上执行的操作,函数里的matrix还是指向外面那个原矩阵的引用,所以修改后外部能看到变化。
思路2:真正的原地转置(不需要创建新矩阵)
如果你想更高效一点,不用生成新矩阵,直接在原矩阵上交换元素就行——不过这个方法只适用于方阵(行数和列数相同的矩阵),刚好你例子里是方阵:
def transpose_in_place(matrix: list): n = len(matrix) # 只遍历矩阵的上三角部分(i < j),避免重复交换元素 for i in range(n): for j in range(i + 1, n): # 直接交换对称位置的元素 matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] print(matrix) #1 matrix = [[1,2,3],[4,5,6],[7,8,9]] transpose_in_place(matrix) print(matrix) #2 这里也会输出转置后的矩阵
这个方法不会出现你之前担心的“用了修改后的元素”的问题,因为我们只交换i < j的位置,每个元素只会被交换一次,不会重复操作。
最后再划个重点:在Python中,如果你想在函数里修改外部的可变对象(比如列表、字典),不要直接给函数内的变量重新赋值,而是要通过对象自身的方法(比如clear()、append())或者修改它的元素来操作,这样才能保留对原对象的引用,让外部变量看到变化。
内容来源于stack exchange
相关产品推荐
相关产品推荐

