Py学习  »  Python

Python一次填充所有列表

Yunnerd • 3 年前 • 1344 次点击  

我用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]] 因为它会同时填满这两个列表。

有人能帮我吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128269
文章 [ 1 ]  |  最新文章 3 年前
timgeb
Reply   •   1 楼
timgeb    3 年前

您添加了相同的列表,表示内存中的相同对象, len(M[0]) 是时候 b 排队 b.append(a) . b、 附加(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