我来自Java背景,正在学习python矩阵运算。我有一个分配问题要手动添加两个矩阵,我无法弄清楚逻辑中的错误。需要帮助谢谢
x = [[12,7,3],[4 ,5,6],[7 ,8,9]]
y = [[5,8,1],[6,7,3],[4,5,9]]
row = len(x)
col = len(x[0])
ans = [[0] * col] * row
for i in range(len(x)):
for j in range(len(x[i])):
ans[i][j] = x[i][j] + y[i][j]
print()
print(ans)
输出:[[11,13,18],[11,13,18],[11,13,18]]
问题在这里:
ans = [[0]*col]*row
此语句创建row
个对象,其中每个对象均为[[0]*col]
。这意味着列表中的每个“子列表”都指向同一列表。
((有关此行为的更多信息,请点击List of lists changes reflected across sublists unexpectedly)
您可以通过检查id
,ans[0]
等的ans[1]
值来验证:
>>> a = [[0]*col]*row
>>>
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> id(a[0])
140336190913992
>>> id(a[1])
140336190913992
>>> id(a[2])
140336190913992
这意味着,如果我们设置a[0][1] = 10
(例如),则每个EACH子列表都将设置10
值。这是因为所有列表都指向同一列表。
即
>>> a[0][1] = 10
>>> a
[[0, 10, 0], [0, 10, 0], [0, 10, 0]]
现在,如何避免这种情况?您可以通过以其他方式初始化ans
列表来做到这一点,例如:
b = [[0 for x in range(col)] for y in range(row)]
您可以再次使用id
来验证所有子列表都指向不同的地址:
>>> id(b[0])
140336190512520
>>> id(b[1])
140336190765000
>>> id(b[2])
140336197031816
因此,如果您现在运行原始程序,将获得所需的结果。
TLDR;您修改后的程序如下所示:
x = [[12,7,3],[4 ,5,6],[7 ,8,9]]
y = [[5,8,1],[6,7,3],[4,5,9]]
row = len(x)
col = len(x[0])
ans = [[0 for x in range(col)] for y in range(row)]
for i in range(len(x)):
for j in range(len(x[i])):
ans[i][j] = x[i][j] + y[i][j]
print(ans)