2013-05-11 101 views
3

我正在Python(2.5.4)中编写一个程序,并且我意识到我的代码不工作是因为非常不寻常的事情。我要举一个例子:Python中的矩阵问题

A = [[0]*2]*2 

当我打印,我得到:

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

这是确定的。但是现在我想改变第一列和第一行中的元素。所以,I型:

A[0][0] = 1 

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

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

不过,我期待

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

这ruinning我的所有代码。我想知道为什么会发生这种情况,以及我如何解决这个问题。

在另一方面,当我输入:

B = [[0,0],[0,0]] 

而且使:

B[0][0] = 1 

我得到:

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

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

+1

更一般地,使用numpy的(http://www.numpy.org/)做的,而不是滚动您自己的数值计算。 – Marcin 2013-05-11 02:50:15

回答

7

这是因为您的清单包含多个参考文献到一个列表。

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

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

enter image description here

该图示中,示出了上述示例。箭头代表对a的引用。他们al = [a,a]。当你改变它们中的一个时,你改变它们的值都指向。该相互作用可以描绘这样的:

enter image description here

我们通过操纵l[0]l[0]是一个参考a),因此我们可以通过改变l[0][0]a改变第一元件操纵a(这将是与a[0]相同)至"A"

一个描述列表[[0]*2]*2看起来像这样

enter image description here

4

“如果你想零的100×100矩阵?”

使用列表理解:

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