嵌套列表对象不支持索引

时间:2012-10-14 09:17:14

标签: python list object indexing

我有一个名为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

稍后在代码中我通过运行:

创建一个Environment实例
myEnv = createEnvironment(6,6)

然后我想通过运行:

向环境中添加一个元素
myEnv.addElement(2,2)

所以我期望发生的是我会收到一个新的Environment对象作为6x6网格,网格位置为2,2。但那没用。

我有两个错误:

  1. 我无法从 init 方法返回除None之外的任何内容。
  2. 尝试执行addElement(2, 2)时的主要问题我收到此错误:

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

  3. 我查看了__getitem____setitem__方法,但无法让它们在多维列表上工作。我应该使用更好的数据结构来创建网格吗?

1 个答案:

答案 0 :(得分: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__。 E.g:

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

例如,允许您执行some_environment[5, 6]。 (您可能更愿意返回列,这取决于您的系统以及哪种方法最适合您)。