我有以下代码:
def matrixReshape(mat, r, c):
if len(mat)*len(mat[0]) != r*c:
return mat
nums = []
for row in range(len(mat)):
for col in range(len(mat[0])):
nums.append(mat[row][col])
res = [[0]*c]*r
for x in range(r):
for y in range(c):
res[x][y] = nums.pop(0)
return res
mat = [[1,2],[3,4]]
print(matrixReshape(mat, 4, 1))
输出:
[[4], [4], [4], [4]]
但是我想让它输出:
[[1], [2], [3], [4]]
我很困惑为什么整个列得到更新。当我在第二个for
循环中打印x
和y
时,我得到:0,0 1,0 2,0 3,0
。
这是因为您正在像这样初始化res
变量:
res = [[0]*c]*r
这使得数组中的每个元素引用相同的值。使用列表推导式初始化列表,它将复制所有元素。这是初始化列表的python方式。
res = [[0 for _ in range(c)] for _ in range(r)]
问题出在这一行。
res = [[0]*c]*r
当[0]
与r和c相乘时,复制数组[0]
。因此,改变它的任何一个实例都会改变所有实例的值。
试试下面这行。
res = [[0 for i in range(c)] for j in range(r)]
使用简单的列表推导式
[[col] for row in mat for col in row]