我必须做一些非常愚蠢的事情,但我似乎无法弄清楚这里出了什么问题。我是一个中级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
似乎不明白这里出了什么问题:(
答案 0 :(得分: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']]
答案 1 :(得分: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]]
当你改变一个,所有改变。