矩阵加法给出错误答案

matrix addition giving wrong answer

我是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]。这意味着列表中的每个 "sub-list" 都指向同一个列表。

(有关此行为的更多信息:List of lists changes reflected across sublists unexpectedly

您可以通过检查 ans[0]ans[1] 等的 id 值来验证:

>>> 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(比方说),那么每个子列表都将设置值 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)