Python中的矩阵问题

Python中的矩阵问题,python,Python,我当时正在用Python(2.5.4)编写一个程序,我意识到我的代码因为一些非常不寻常的事情而无法工作。我将举一个例子: A = [[0]*2]*2 当我打印A时,我得到: [[0, 0], [0, 0]] 没关系。但是现在我想更改第一列和第一行中的元素。所以我键入: A[0][0] = 1 但当我再次打印时,我得到: [[1, 0], [1, 0]] 然而,我期待着 [[1, 0], [0, 0]] 这毁了我所有的代码。我想知道为什么会发生这种情况,以及如何解决它 另一方面,当我键入

我当时正在用Python(2.5.4)编写一个程序,我意识到我的代码因为一些非常不寻常的事情而无法工作。我将举一个例子:

A = [[0]*2]*2
当我打印A时,我得到:

[[0, 0], [0, 0]]
没关系。但是现在我想更改第一列和第一行中的元素。所以我键入:

A[0][0] = 1
但当我再次打印时,我得到:

[[1, 0], [1, 0]]
然而,我期待着

[[1, 0], [0, 0]]
这毁了我所有的代码。我想知道为什么会发生这种情况,以及如何解决它

另一方面,当我键入时:

B = [[0,0],[0,0]]
并作出:

B[0][0] = 1
我得到:

[[1, 0], [0, 0]]

这更奇怪!这两种实现矩阵的方法不是等价的吗?如果我想要一个带零的100x100矩阵呢?对于这种情况,使用2x2矩阵,我可以键入[[0,0],[0,0]]。但这不是一个好的解决方案。

这是因为您的列表包含多个对列表的引用

>>> a = [0]
>>> l = [a,a]
>>> l[0][0] = "A"
>>> l
[['A'], ['A']]
我们创建一个列表并将其绑定到
a
。然后,我们通过
l=[a,a]
在列表
l
中存储对
a
的两个引用。然后我们操纵对
a
one引用,并将其第一个元素更改为
“a”
。由于引用引用了内存中的一个位置,因此我操作该引用(
l
中的任一元素)时会更改内存中的值,从而影响对
a
的所有其他引用

此图描述了上述示例。箭头表示对
a
的引用。它们是
l=[a,a]
中的
a
。当您更改其中一个时,您将更改它们都指向的值。这种互动可以这样描述:

我们通过操纵
l[0]
来操纵
a
l[0]
是对
a
的引用),因此我们可以通过将
l[0][0]
(与
a[0]
相同)更改为
“a”
来更改
a
中的第一个元素

您的列表的描述
[[0]*2]*2
如下所示

如果你想要一个100 x 100的零矩阵怎么办

使用列表理解:

[[0] * 100 for x in range(100)]
更一般地说,使用numpy()进行数值计算,而不是自己滚动。