2014-01-10 42 views
10

我有這樣的7x7二維數組:Python的二維陣列 - 改變元件

l=[[1, 1, 1, 1, 1, 1, 1], 
    [1, 0, 2, 0, 0, 0, 1], 
    [1, 0, 0, 0, 0, 0, 1], 
    [1, 0, 0, 0, 0, 0, 1], 
    [1, 0, 0, 0, 0, 0, 1], 
    [1, 0, 0, 0, 0, 0, 1], 
    [1, 1, 1, 1, 1, 1, 1]] 

正如你可以看到,L [1] [2] = 2。當我打印它時,元素打印正確。這裏沒問題。但是,當我嘗試將它從「2」更改爲「3」或任何其他數字時,程序將更改該列(此例中爲第三列)中除第一個和最後一個之外的所有元素。例如,如果我輸入驗證碼

l[1][2]=5 

,然後打印二維數組,我得到這個:

l=[[1, 1, 1, 1, 1, 1, 1], 
    [1, 0, 5, 0, 0, 0, 1], 
    [1, 0, 5, 0, 0, 0, 1], 
    [1, 0, 5, 0, 0, 0, 1], 
    [1, 0, 5, 0, 0, 0, 1], 
    [1, 0, 5, 0, 0, 0, 1], 
    [1, 1, 1, 1, 1, 1, 1]] 

這種情況與我選擇的每一個元素。它不是隻改變那個元素,而是改變整個列。 有誰知道可能是什麼問題?謝謝!

+1

不可再現之前。 – thefourtheye

+1

我無法複製它。你能不能在python解釋器中運行所有這些?你使用哪種Python? – lpapp

+0

即使您有NumPy矩陣或對同一列表的多個引用,這也沒有任何意義。請給我們一個真正的口譯員會議嗎? – user2357112

回答

20

即使您描述的行爲(如您所描述的那樣)是不可能的,但我仍會對此採取刺探行動。

如果您創建一個列表,您需要確保每個子列表都是不同的列表。考慮:

a = [] 
b = [a, a] 

這裏我創建了一個列表,其中兩個子列表都是完全相同的列表。如果我改變它,它會出現在兩個。例如: -

>>> a = [] 
>>> b = [a, a] 
>>> b[0].append(1) 
>>> b 
[[1], [1]] 

,你會經常看到一個列表這種行爲使用*操作初始化:

a = [[None]*7]*7 

例如

>>> a = [[None]*7]*7 
>>> a 
[[None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None]] 
>>> a[0][1] = 3 
>>> a 
[[None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None]] 

,修復方法是外列表中不使用* 7(內部列表是OK,因爲None是不可改變的)

a = [[None]*7 for _ in range(7)] 

如:

>>> a = [[None]*7 for _ in range(7)] 
>>> a[0][1] = 3 
>>> a 
[[None, 3, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None]] 
+0

謝謝。這是問題所在。我用你的建議解決了它。 – Joker

1

你」已經構建了你的名單錯誤。

中間項目都指同一個列表,以便更新一個引起的變化在其他人反映

如果你表現出你使用來構建列表中的代碼,我可以告訴你如何要解決這個問題。

或者

l = [sublist[:] for sublist in l] 

開始修改列表將所有分離到的那些新的列表