Python 一次填满所有列表
Python filling all lists at once
我在 python 中编写了这个函数来执行矩阵乘法,但由于某些原因它没有按预期工作。代码对我来说看起来不错,但 python 似乎填充了矩阵中位置 y 的所有列表,我不明白为什么要这样做。
def maal(N, M):
a = []
b = []
for i in range(len(N)):
a.append(0)
for j in range(len(M[0])):
b.append(a)
for x in range(len(N)):
for y in range(len(M[0])):
for z in range(len(M)):
b[x][y] += N[x][z] * M[z][y]
return b
print(maal([[5, 4, 32], [5, 6, 74]], [[1, 2], [4, 5], [7, 8]]))
#solution is b = [[245, 286],[547,632]]
我得到的输出是 [[792, 918], [792, 918]]
因为它同时填充了两个列表。
谁能帮帮我?
您正在追加相同的列表,这意味着内存中的相同对象,len(M[0])
次到行 b.append(a)
中的 b
。 b.append(a)
不复制a.
将该行更改为 b.append(a[:])
或 b.append(a.copy())
。
代码中发生的事情的简化演示:
>>> a = [0, 0, 0]
>>> b = []
>>> b.append(a)
>>> b.append(a)
>>> a[-1] = 1
>>> a
[0, 0, 1]
>>> b
[[0, 0, 1], [0, 0, 1]]
>>> b[0] is a
True
>>> b[1] is a
True
我在 python 中编写了这个函数来执行矩阵乘法,但由于某些原因它没有按预期工作。代码对我来说看起来不错,但 python 似乎填充了矩阵中位置 y 的所有列表,我不明白为什么要这样做。
def maal(N, M):
a = []
b = []
for i in range(len(N)):
a.append(0)
for j in range(len(M[0])):
b.append(a)
for x in range(len(N)):
for y in range(len(M[0])):
for z in range(len(M)):
b[x][y] += N[x][z] * M[z][y]
return b
print(maal([[5, 4, 32], [5, 6, 74]], [[1, 2], [4, 5], [7, 8]]))
#solution is b = [[245, 286],[547,632]]
我得到的输出是 [[792, 918], [792, 918]]
因为它同时填充了两个列表。
谁能帮帮我?
您正在追加相同的列表,这意味着内存中的相同对象,len(M[0])
次到行 b.append(a)
中的 b
。 b.append(a)
不复制a.
将该行更改为 b.append(a[:])
或 b.append(a.copy())
。
代码中发生的事情的简化演示:
>>> a = [0, 0, 0]
>>> b = []
>>> b.append(a)
>>> b.append(a)
>>> a[-1] = 1
>>> a
[0, 0, 1]
>>> b
[[0, 0, 1], [0, 0, 1]]
>>> b[0] is a
True
>>> b[1] is a
True