为何两段Python n×n矩阵旋转代码执行效果不同?
两段旋转矩阵代码效果不同的原因
第一段代码的逻辑(符合预期)
第一段代码先创建了一个完全独立的全新n×n矩阵result,通过双层循环把原matrix的元素按顺时针旋转90度的规则填充到result中,最后再把result的内容完整复制回原matrix。整个过程中,result和原matrix没有任何共享的子列表,所有操作都是基于原始矩阵的固定数据,所以能得到正确的旋转结果。
第二段代码的问题核心:浅拷贝导致数据污染
第二段代码里的result = matrix.copy()是Python列表的浅拷贝操作:
- 对于二维列表来说,浅拷贝只会复制外层列表的结构,里面的每个子列表(比如
matrix[0]、matrix[1])并不会被复制,result里的子列表和原matrix的子列表指向的是同一个内存对象。 - 当你在循环中修改
matrix[i][j]时,其实是直接修改了和result共享的子列表元素。这就导致后续循环用到result的时候,它已经不是最初的原矩阵数据了,而是被修改后的脏数据,最终旋转结果自然出错。
举个简单例子,假设原矩阵是:
matrix = [[1,2,3],[4,5,6],[7,8,9]]
执行result = matrix.copy()后,result[0]和matrix[0]是同一个列表。当你修改matrix[0][0] = result[-0-1][0](也就是matrix[0][0] = 7)时,result[0][0]也会变成7,后续再用result取值时就不是原始的1了。
修复第二段代码的方法
如果想保留第二段的逻辑,需要把浅拷贝改成深拷贝,确保result和原matrix完全独立:
import copy def rotate(matrix: List[List[int]]) -> None: result = copy.deepcopy(matrix) for i in range(len(matrix)): for j in range(len(matrix)): matrix[i][j] = result[-j-1][i]
或者像第一段代码那样,手动创建全新的二维列表,避免共享子列表的问题。
内容的提问来源于stack exchange,提问作者Miłosz Wiśniewski
相关产品推荐
相关产品推荐

