python - 逆时针旋转矩阵也会改变原始矩阵

标签 python python-3.x

所以我目前有一个逆时针旋转矩阵的函数,列表始终是方形网格:

def rotate(m: List[List[int]]) -> None:
temp = m.copy()

if len(m) > 1:   
    for x in range(len(m)):
        for y in range(len(m)):
            temp[len(m)-1-y][x] = m[x][y]

m = temp.copy()

我已经反复跟踪这个函数,据我所知它应该可以工作。问题是,由于某种原因,每次对 temp 的更改都会影响原始列表。例如,

ORIGINAL =

[[1, 2, 3], 

[4, 5, 6], 

[7, 8, 9]]

WHAT SHOULD OUTPUT = 

[[3, 6, 9], 

[2, 5, 8], 

[1, 4, 7]]

WHAT ACTUALLY OUTPUTS = 

[[3, 6, 1], 

[2, 5, 2], 

[1, 2, 1]

我使用的是 python 版本 3.7.0,并且也尝试过滑动而不是复制字符串,但发生了同样的事情。有谁知道为什么吗?

最佳答案

由于 m 列表中的每个项目都是对子列表的引用,因此当您通过调用 m.copy() 复制 m 列表时,它只是复制子列表的引用,而不创建子列表的新副本,这就是为什么对 temp 列表的每次更改都会反射(reflect)在原始 m 上> 列表。

您也应该使用 copy.deepcopy() 来复制子列表:

from copy import deepcopy
def rotate(m):
    temp = deepcopy(m)
    if len(m) > 1:
        for x in range(len(m)):
            for y in range(len(m)):
                temp[len(m)-1-y][x] = m[x][y]
    return temp

这样:

rotate([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])

返回:

[[3, 6, 9],
 [2, 5, 8],
 [1, 4, 7]]

或者,您可以通过压缩列表列表并反转它来实现相同的矩阵旋转:

def rotate(m):
    return list(zip(*m))[::-1]

关于python - 逆时针旋转矩阵也会改变原始矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53271464/

相关文章:

python - hadoop,python,子进程失败,代码为 127

python - 如何在 python 中向量化一组项目

python - 使用 matplotlib 绘图 : hours shown as float

python-3.x - Python - 比较 2 个单词并检查它们是否是变位词

python - PyCharm - venv 没有被激活

安装了Python3.6但版本显示为3.5.2

python - 是否有方法/属性/var 可以获取 python3 unittest 中跳过的测试列表?

python - selenium webdriver python - 如果自定义编写的 python 代码中存在错误,则使 selenium 测试用例失败

python-3.x - 为什么调用 Google Slides API 返回错误?

python-3.x - 检查 Python 中的类型提示覆盖率