You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:47:12