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

稍后在代码中,我通过运行创建一个 Environment 实例:

myEnv = createEnvironment(6,6)

然后我想通过运行向环境中添加一个元素:

myEnv.addElement(2,2)

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

我有两个错误:

  1. 我无法从init方法返回 None 以外的任何内容。
  2. 我们在尝试执行时遇到的主要问题是addElement(2, 2)这个错误:

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

我查看了__getitem__and__setitem__方法,但无法让它们处理多维列表。我应该使用更好的数据结构来创建网格吗?

4

1 回答 1

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]。(您可能宁愿返回该列,这取决于您的系统以及最适合您的方式)。

于 2012-10-14T09:20:20.880 回答