Python2D矩阵简单逻辑可以工作,但矩阵打印逻辑不能显示正确的矩阵

Python2D矩阵简单逻辑可以工作,但矩阵打印逻辑不能显示正确的矩阵,python,Python,我做的一定很蠢,但我似乎不知道这里出了什么问题。我是一名中级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 ra

我做的一定很蠢,但我似乎不知道这里出了什么问题。我是一名中级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]]

现在我面临一个有趣的问题。 我确实看到核心逻辑for循环包含了我想要的精确值。我通过在for循环中打印元素来验证它

但是当我打印出循环的值时,我总是得到最后一行 因此,输出不是:

d a
e b
f c
我得到:

f c
f c
f c

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

您可以在这里使用
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']]

您可以在此处使用
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']]
当你这样做的时候

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]]
当你改变一个,所有的都会改变。

当你改变时

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

当您更改一个时,所有内容都会更改。

user999755:所以您可以使用
Xr=[[0]*m表示范围(n)内的i)
。能否请您详细解释一下如何获取对同一列表的引用??python文档中的任何引用或其他可能有助于对此进行更多说明的引用?@user999755:文档中标题为的部分提到了它。简言之,原因是使用*复制列表不会创建副本,而只会创建副本es对现有对象的引用。user999755:因此,您可以改为使用
Xr=[[0]*m表示范围(n)中的i)
。能否请您详细解释一下如何获取对同一列表的引用??python文档中的任何引用或其他可能有助于对此进行更多说明的引用?@user999755:文档中标题为的部分提到了它。简言之,原因是使用*复制列表不会创建副本,而只会创建副本es对现有对象的引用。非常简洁,但不回答OP关于其代码错误的问题。非常简洁,但不回答OP关于其代码错误的问题。