二维矩阵旋转函数输出不符合预期,请求解析原因
二维矩阵旋转函数的问题分析
问题描述
实现了一个用于二维矩阵旋转的rotate函数,输入矩阵为[[1,2,3],[4,5,6],[7,8,9]],期望输出为[[7,4,1],[8,5,2],[9,6,3]],但函数返回了三个完全相同的长列表;而直接执行逐个插入的代码却能得到正确结果,需解释背后原因。
错误代码示例
# Input: matrix = [[1,2,3],[4,5,6],[7,8,9]] # Output: [[7,4,1],[8,5,2],[9,6,3]] def rotate(matrix): master_lst = [[]]*len(matrix) for val in matrix: for i, v in enumerate(val): master_lst[i].insert(0, v) #print(f"master_lst[{i}].insert(0, {v})") return master_lst matrix = [[1,2,3],[4,5,6],[7,8,9]] rotate(matrix)
错误输出
[[9, 8, 7, 6, 5, 4, 3, 2, 1], [9, 8, 7, 6, 5, 4, 3, 2, 1], [9, 8, 7, 6, 5, 4, 3, 2, 1]]
正确执行的代码示例
master_lst = [[], [], []] master_lst[0].insert(0, 1) master_lst[1].insert(0, 2) master_lst[2].insert(0, 3) master_lst[0].insert(0, 4) master_lst[1].insert(0, 5) master_lst[2].insert(0, 6) master_lst[0].insert(0, 7) master_lst[1].insert(0, 8) master_lst[2].insert(0, 9) master_lst
原因分析
问题核心出在master_lst = [[]]*len(matrix)这一行:
- 这种写法创建的列表中,所有子列表都是同一个空列表对象的引用。也就是说
master_lst[0]、master_lst[1]、master_lst[2]指向内存中同一个列表,无论操作哪个索引的子列表,本质都是在修改同一个列表。最后返回的三个元素自然是同一个列表的内容,因此出现三个完全相同的长列表。 - 而手动写
[[], [], []]时,每个[]都是独立创建的新列表对象,彼此没有关联。修改不同索引的子列表只会影响对应的那个列表,因此能得到正确结果。
修正方案
将创建master_lst的代码改为列表推导式,确保每个子列表都是独立的新对象:
master_lst = [[] for _ in range(len(matrix))]
内容的提问来源于stack exchange,提问作者KardinaL
相关产品推荐
相关产品推荐

