所以我目前有一个逆时针旋转矩阵的函数,列表始终是方形网格:
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/