列表复制与参考-2D矩阵旋转

时间:2019-02-16 22:42:43

标签: python

我试图像这样对2D矩阵进行90度的顺时针旋转:

Goal: Rotate CW
[1,2,3]
[4,5,6]
[7,8,9]
----Reverse order of rows in matrix.
    [7,8,9]
    [4,5,6]
    [1,2,3]
----Zip together first elements in each row.
    [7,4,1]
    [8,5,2]
    [9,6,3]

我编写了以下函数来执行此操作,当我在自己的测试数据上运行该函数时,该函数运行良好:

# Works on my own test cases
def rotate_matrix(square_matrix):
    square_matrix = zip(*square_matrix[::-1])
    square_matrix = list(map(list, square_matrix))
    return square_matrix

例如:

m1 = [[1, 2],
      [3, 4]]
r1 = rotate_matrix(m1)
# r1:
# [[3, 1]
#  [4, 2]]


m2 = [[1,2,3,4],
      [5,6,7,8],
      [9,10,11,12],
      [13,14,15,16]]
r2 = rotate_matrix(m2)
# r2:
# [[13, 9, 5, 1]
#  [14, 10, 6, 2]
#  [15, 11, 7, 3]
#  [16, 12, 8, 4]]

现在,我正在阅读《 Python中的编程面试要素》一书,该书具有针对这些问题的测试框架(位于https://github.com/adnanaziz/EPIJudge),除非将代码修改为以下内容,否则我将无法通过任何测试用例。以下:

# Works on EPI test cases
def rotate_matrix(square_matrix):
    square_matrix[:] = zip(*square_matrix[::-1])
    square_matrix[:] = map(list, square_matrix)
    return square_matrix

我以为我了解python列表的特质,但在这里我很茫然。我正在尝试修改列表,为什么要在赋值语句中使用square_matrix[:]而不是square_matrix

仅当我在EPI测试框架中运行它时才再次遇到问题。实际上,一旦删除[:] PyCharm就会告诉我“未使用局部变量'square_matrix'值”。

0 个答案:

没有答案