Python中的矩阵问题

时间:2013-05-11 02:26:51

标签: python

我在Python(2.5.4)中编写了一个程序,我意识到我的代码因为一些非常不寻常的东西而无法工作。我将举一个例子:

A = [[0]*2]*2

当我打印A时,我得到:

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

没关系。但是现在我想要更改第一列和第一行中的元素。所以我输入:

A[0][0] = 1

但是当我再次打印A时,我得到了:

[[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]]。但这不是一个好的解决方案。

2 个答案:

答案 0 :(得分:7)

这是因为您的列表包含多个 引用 到列表中。

>>> a = [0]
>>> l = [a,a]
>>> l[0][0] = "A"
>>> l
[['A'], ['A']]

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

enter image description here

此插图描绘了上面的例子。箭头表示对a的引用。他们 a中的l = [a,a]。当您更改其中一个时,您可以更改两者指向的值。这种互动可以这样描述:

enter image description here

我们通过操纵a来操纵l[0]l[0]是对a的引用),因此我们可以通过更改来更改a中的第一个元素l[0][0]的{​​{1}}(与a[0]相同)。{/ 1}}。

描述您的列表"A"看起来像这样

enter image description here

答案 1 :(得分:4)

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

使用列表理解:

[[0] * 100 for x in range(100)]