0

一定是我正在做的非常愚蠢的事情,但我似乎无法弄清楚这里出了什么问题。我是一个中级 python 用户。

我编写了一个逻辑来将给定的 2D 矩阵旋转 90 度。很简单的逻辑。有趣的是,矩阵实际上是旋转的,但是当我尝试打印它时,它始终只打印最后一行。

这是逻辑:

def mat_rot(X):
    m = len(X)
    n = len(X[0])
    Xr = [[0]*m]*n
    for k in range(n):  # label: core_logic_for_loop
        for l in range(m):
            Xr[k][l] = X[m-1-l][k]

    m = len(Xr)
    n = len(Xr[0])
    for i in range(m):  # label: print_for_loop
        for j in range(n):
            sys.stdout.write(" i=%s j=%s, Xr=%s " %(i, j,Xr[i][j]))
        print " "
    return

所以,如果我给出一个像:[[a,b,c],[d,e,f]] 这样的矩阵,我应该得到输出为 [[d,a],[e,b],[f,c] ]

现在这是我面临的一个有趣的问题。我确实看到 core_logic_for_loop 确实包含我想要的确切值。我通过打印 for 循环中的元素来验证它。

但是当我到达 print_for_loop 并打印值时,我总是得到最后一行,而不是输出:

d a
e b
f c

我得到:

f c
f c
f c

似乎不明白这里出了什么问题:(

4

2 回答 2

4

你可以zip在这里使用:

>>> lis = [['a','b','c'],['d','e','f']]
>>> [ x[::-1] for x in zip(*lis) ]
[('d', 'a'), ('e', 'b'), ('f', 'c')]

#or
>>> [ list(reversed(x)) for x in zip(*lis)]
[['d', 'a'], ['e', 'b'], ['f', 'c']]
于 2013-06-12T20:16:53.533 回答
2

当你这样做

Xr = [[0]*m]*n

您实际上得到了对同一个列表的多个引用。

m = 2
n = 2
Xr = [[0]*m]*n
print Xr
# [[0, 0], [0, 0]]
Xr[0][0] = 1
print Xr
# [[1, 0], [1, 0]]

当你改变一个时,一切都会改变。

于 2013-06-12T20:23:42.557 回答