2015-03-03 37 views
3

所以我使用嵌套表來存儲一些數據,我在不斷變化的子列表中的一個特定值的麻煩:的Python:嵌套表的更改值

if attributes[3] == 'W': 
    self.board[3][3] = 'W' 

(數字佔位符我用來測試)

板是一個類變量,創建如下(我想創建一個用戶指定的網格,他們的輸入爲列和行的大小組成前兩個部分屬性)

self.board = [] 
rows = [] 
self.score = [0, 0] 
for x in range(attributes[0]): 
    rows.append('') 
for y in range(attributes[1]): 
    self.board.append(rows) 

但是,每當我試圖改變一個子表的價值,它改變了價值爲同一指數的所有子表:

[['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', ''], ['', '', '', 'W', '', '', '', '']] 

我無法弄清楚什麼是錯的。有人有主意嗎?

回答

0

我想這樣做的原因可以在這個非常簡單的例子來說明:

a = [1,2,3] 

b = [a,a,a] # <- this is what you are actually doing 

print(list(map(id,b))) 
#[140475353832712, 140475353832712, 140475353832712] 

請並非所有的ID是一樣的上方。這意味着你正在追逐你的清單,引用同一個對象。從而改變一個存活,改變每個子列表。

但是,你應該這樣做(或某些等效):

b2 = [a[:], a[:], a[:]] # 
print(list(map(id,b2))) 
#[140475353832136, 140475353832072, 140475353832520] 

請注意,不同的ID對每個子列表。現在b2包含對不同子列表的引用。

綜上所述,你應該有這樣的:

for y in range(attributes[1]): 
    self.board.append(rows[:]) 
2

通過self.board.append(rows)要附加在一個循環中相同的列表。你需要的是附加的行列表的副本:self.board.append(rows[:])

因此,修改後的代碼將是:

self.board = [] 
rows = [] 
self.score = [0, 0] 
for x in range(attributes[0]): 
    rows.append('') 
for y in range(attributes[1]): 
    self.board.append(rows[:])