首页 > 解决方案 > 在 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]]

那么我在这里错过了什么?

标签: pythonlist

解决方案


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

推荐阅读