Python 3.x 矩阵加法给出错误答案

Python 3.x 矩阵加法给出错误答案,python-3.x,matrix,addition,Python 3.x,Matrix,Addition,我来自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])): an

我来自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
此语句创建对象的行数,其中每个对象为[[0]*col]。这意味着,列表中的每个子列表都指向同一个列表

有关此行为的更多信息,请参见:

您可以通过检查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
这意味着,如果我们设置一个[0][1]=10,那么每个子列表的值都将设置为10。这是因为所有列表都指向同一个列表

i、 e

现在,我们如何避免这种情况? 您可以通过以下不同方式初始化ans列表来完成此操作:

b = [[0 for x in range(col)] for y in range(row)]
您可以再次使用id验证所有子列表是否指向不同的地址:

所以现在如果你运行你原来的程序,你会得到想要的结果

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)
>>> id(b[0])
140336190512520
>>> id(b[1])
140336190765000
>>> id(b[2])
140336197031816
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)