为什么此代码不会转置列表列表
import sys
t = input()
for k in range(t):
n,m = [int(i) for i in raw_input().strip().split()]
A = [[None]*m]*n
B = [[None]*n]*m
for l in range(n):
A[l] = raw_input().strip().split()
for j in range(m):
for i in range(n):
B[j][i] = A[i][j]
print B
我知道有更好的方法来转置矩阵,但为什么这不起作用?
答案 0 :(得分:0)
替换
A = [[None]*m]*n
B = [[None]*n]*m
带
A = [[None for x in range(m)] for x in range(n)]
B = [[None for x in range(n)] for x in range(m)]
为什么呢?
>>> l = [2]*5
>>> l
[2,2,2,2,2]
>>> [id(value) for value in l]
[26089400, 26089400, 26089400, 26089400, 26089400]
你能看到那里发生了什么吗?
内存中只有一个副本,其值为'2'。所有列表元素都指向保持值为“2”的相同内存位置。
所以,当你这样做时:
A = [[None]*m]*n
您正在创建一个二维数组,其元素指向相同的内存位置。 更改其中一个,更改存储在该公共内存位置的值,从而更改所有元素存储的值!
这就是该计划无效的原因。
详细了解Python中所有这些是如何工作的: http://foobarnbaz.com/2012/07/08/understanding-python-variables/