2010-11-21 39 views
0
cell={'num':0,'state':1} 
cell_2d=[] 
cell_list=[] 
for i in range(2): 
    for j in range(2): 
    cell_list=cell_list+[cell] 
    cell_2d=cell_2d+[cell_list] 
    cell_list=[] 
print "initially:" 
print cell_2d 
cell_2d[0][0]['num']=-1 
print "finally:" 
print cell_2d 

輸出一個2維陣列(字典的列表的列表)是:問題得到

最初: [[{ '州':1 'NUM':0},{ '州' :1,'num':0}],[{'state':1,'num':0},{'state':1,'num':0}]] finally: [[{'state ':1,'num':-1},{'state':1,'num':-1}],[{'state':1,'num':-1},{'state':1 ,'num':-1}]]

當執行第11行時,我希望只有第一個cell_2d列表的第一個元素被改變。但是輸出顯示cell_2d的所有元素的所有'num'都被更改爲-1。無法弄清爲什麼會發生這種情況。有人可以告訴我代碼有什麼錯誤嗎?提前Thanx。

+0

你可以編輯你的答案,並使用101010按鈕來標記代碼段,所以它們被格式化爲代碼? – 2010-11-21 12:37:11

回答

2

好吧,我明白了。您正在重新使用cell對象。由於Python使用引用,因此只需對同一個對象進行四次引用,因此當您更改引用時,就會將其全部更改。

您的內環內,嘗試:

cell_list = cell_list + [{'num':1, 'state':0}] 

這可以縮短爲:

cell_list.append({'num':1, 'state':0}) 

或者,其實,你可以更換內環(其中j):

cell_list = [{'num':1, 'state':0} for j in range(2)] 
+1

@Newbie_python:這也更有效率。對於單個項目,請始終使用'.append',並使用'.extend'或'+ ='來加入兩個列表。原則上,如果你這樣做,而不是'cell_list = cell_list + ...',做'cell_list + = ...';它更整潔,速度更快(而不是創建另一個新列表)。 – 2010-11-21 12:47:41

+0

除此之外,還可以執行cell_list.append(dict(cell)),它會生成單元格的新副本。由於單元格的內容由不可變類型組成,因此這是安全的。 – extraneon 2010-11-21 12:47:48

+0

非常感謝你:)它現在的作品! – coder 2010-11-21 12:53:03

0

只需更換此線

cell_2d=cell_2d+[cell_list] 

有了這個

cell_2d = cell_2d + [ cell_list.copy() ] 

這樣蟒蛇將使從字典「cell_list」,而不是存儲引用的副本。

+0

cell_list不是一本字典。它的字典清單。所以copy()方法在cell_list上不起作用 – coder 2010-11-21 13:00:55