2012-10-14 79 views
1

我有一個嵌套列表,命名ENV,在構造和另一方法創建填充定義如下的網格的元件:嵌套列表對象不支持索引

class Environment(object): 
    def __init__(self,rowCount,columnCount): 
     env = [[ None for i in range(columnCount)] for j in range(rowCount) ] 
     return env  

    def addElement(self, row, column): 
     self[row][column] = 0 

在我創建代碼後來通過運行環境的實例:

myEnv = createEnvironment(6,6) 

然後我想通過運行添加到環境中的元素:

myEnv.addElement(2,2) 

所以我期望發生的事情是,我將接收一個新的Environment對象作爲一個6x6網格,在網格的2,2位置有一個0。但那並不奏效。

我有兩個錯誤:

  1. 我無法回到總比沒有從INIT方法的任何其他。
  2. 的主要問題我們試圖執行addElement(2, 2)我得到這個錯誤時:

    "TypeError: 'Environment' object does not support indexing.

我看着__getitem____setitem__方法,但無法讓他們工作在一個多維列表。有沒有更好的數據結構,我應該用來創建網格?

回答

5

這裏的問題是,你不能用__init__替換對象。你可以繼承list和做一些__new__,也許,但是這將是巨大的矯枉過正,是更好的選擇僅僅是包裝清單:

class Environment(object): 
    def __init__(self, rows, columns): 
     self.env = [[None for column in range(columns)] for row in range(rows) ] 

    def addElement(self, row, column): 
     self.env[row][column] = 0 

請注意,這是你聲稱要打電話myEnv = createEnvironment(6,6)有點奇怪 - 使用一個函數而不是構造函數有點奇怪。

如果你真的希望你的對象像列表一樣行事,你當然可以提供一些額外的包裝功能,如__getitem__/__setitem__。例如:

def __getitem__(self, row, column): 
    return self.env[row][column] 

例如,這可以讓你做some_environment[5, 6]。 (你可能更願意返回列,這取決於你的系統和什麼最適合你)。