python - 在 python 中使用 list.reverse 和 list = list[::-1] 的区别
问题描述
我正在编写一种算法,将方阵原地旋转 90º 度,而不使用第二个矩阵。它有效,但我有一个小问题困扰着我。
所以基本的工作算法是:
def rotate(matrix):
n = len(matrix)
# reverse rows
matrix.reverse()
# reflect
start = 0
for row in range(n):
for col in range(start, n):
matrix[row][col], matrix[col][row] = matrix[col][row], matrix[row][col]
start = start + 1
这个想法是传递一个定义为列表列表的矩阵,例如[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
.
示例输入/输出:
>>> some_matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> rotate(some_matrix)
>>> print(some_matrix)
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
伟大的。所以,我想知道我是否可以matrix.reverse()
用一些更直观的东西来代替,比如简单地使用切片索引。所以我写了一个新的rotate
,像这样:
def rotate2(matrix):
n = len(matrix)
# reverse rows
matrix = matrix[::-1]
# reflect
start = 0
for row in range(n):
for col in range(start, n):
matrix[row][col], matrix[col][row] = matrix[col][row], matrix[row][col]
start = start + 1
哪个应该给我相同的结果,基于:
>>> a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b = a
>>> b = b[::-1]
>>> a.reverse()
>>> print(a)
[[7, 8, 9], [4, 5, 6], [1, 2, 3]]
>>> print(b)
[[7, 8, 9], [4, 5, 6], [1, 2, 3]]
>>> print(a==b)
True
但是,当我rotate2
在同一个输入/输出示例中使用时,我得到:
>>> some_matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> rotate2(some_matrix)
>>> print(some_matrix)
[[9, 6, 3], [8, 5, 2], [7, 4, 1]]
那么我在这里错过了什么?
解决方案
matrix = matrix[::-1]
创建一个新列表并将其分配给本地名称matrix
;它不会就地修改原始列表。
matrix.reverse()
,另一方面,确实修改了原始列表。
考虑这些简单的函数:
def r1(m):
m = m[::-1]
def r2(m):
m.reverse()
>>> x = [[1,2], [3,4]]
>>> r1()
>>> x
[[1,2], [3,4]]
>>> r2()
>>> x
[[3,4],[1,2]]
推荐阅读
- plot - 字数和情绪图
- python - 正则表达式向量
- selenium-webdriver - 使用 Selenium Python 处理窗口
- android - Android - 在使用带有导航组件的 CollapsingToolbar 时自定义处理导航
- iis - IIS 与任务管理器的内存消耗
- excel - 在 Excel 中修剪空格而不丢失格式
- aws-cdk - 如何将自定义 Lambda 层包含到管道堆栈中?(AWS-CDK)
- r - 了解 R 中 agrep 模糊匹配中的约束
- python - Tensorflow 给出“ValueError:检查输入时出错”
- javascript - React-Native 如何将我的 json 数据返回到我的道具?