在python中使用list.reverse和list=list[::1]之间的区别

2024-10-04 01:22:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个算法,将一个方阵旋转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]]

那么我在这里错过了什么


Tags: in算法fordefrange矩阵colsome
1条回答
网友
1楼 · 发布于 2024-10-04 01:22:38

matrix = matrix[::-1]创建一个新列表,并将其分配给本地名称matrix;它不会就地修改原始列表

另一方面,确实修改了原始列表

考虑这些简单函数:

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]]

相关问题 更多 >