矩阵加法给出错误的答案

问题描述 投票:0回答:1

我来自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]]

python-3.x matrix addition
1个回答
0
投票

问题在这里:

ans = [[0]*col]*row

此语句创建row个对象,其中每个对象均为[[0]*col]。这意味着列表中的每个“子列表”都指向同一列表。

((有关此行为的更多信息,请点击List of lists changes reflected across sublists unexpectedly

您可以通过检查idans[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)
© www.soinside.com 2019 - 2024. All rights reserved.