2013-05-11 103 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)]