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) 中的 bb.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