矩阵加法给出错误答案
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)
我是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)