2013-07-02 61 views
0

我的程序使用下面的代碼插入名爲Field到被動態創建一個多維數組(至少我認爲這將是創建)一個對象:的Python 2多維數組創建

for x in range(self.width): 
    for y in range(self.height): 
      self.board_fields[x][y] = Field() 

所以board_fields沒有動態創建,我得到了錯誤:

AttributeError: 'Board' object has no attribute 'board_fields'

我應該如何定義把值到它之前,多維數組?

+0

你肯定的是,上述代碼執行得到?因爲,這個錯誤讓我覺得,python甚至不知道'board_fields'是什麼。 – thefourtheye

回答

2
self.board_fields = [[Field() for j in range(self.height)] for i in range(self.width)] 
+0

Upvoted :)有沒有其他方法可以創建多維數組,只有默認的python庫? – thefourtheye

+1

除了列表推導(我在上面使用過),您可以使用嵌套的* for *循環(如@ astex的解決方案)。對於任意數量的維度,您可以編寫一個接受維度列表的遞歸函數。 – bogatron

1

這些並不是真正意義上的數組,而是列表的列表。雖然這在某些情況下是語義上的差異,但它影響列表中可以進行分配的位置。 append語句將額外的內存分配給列表並將其參數分配給該新的「插槽」。

self.board_fields = [] 
for x in range(self.width): 
    board_fields_sub = [] 
    for y in range(self.height): 
     board_fields_sub.append(Field()) 
    self.board_fields.append(board_fields_sub) 
+0

如果你的意思是添加行'self.board_fields = []'那麼我得到錯誤'self.board_fields [x] [y] = Field() IndexError:列表索引超出範圍' – Tom

+1

@Tom不,這就是不夠。一個空列表仍然沒有項目,因此索引將失敗。 astex創建空列表,然後將項目附加到該列表。 – poke