嵌套列表对象不支持索引

use*_*292 1 python indexing list object

我有一个名为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
Run Code Online (Sandbox Code Playgroud)

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

myEnv = createEnvironment(6,6)
Run Code Online (Sandbox Code Playgroud)

然后我想通过运行以下命令向环境添加元素:

myEnv.addElement(2,2)
Run Code Online (Sandbox Code Playgroud)

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

我有两个错误:

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

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

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

Gar*_*tty 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
Run Code Online (Sandbox Code Playgroud)

请注意,你声称要调用它有点奇怪myEnv = createEnvironment(6,6)- 使用函数而不是构造函数有点奇怪.

如果你真的希望你的对象像列表一样工作,你当然可以提供一些额外的包装函数,比如__getitem__/ __setitem__.例如:

def __getitem__(self, row, column):
    return self.env[row][column]
Run Code Online (Sandbox Code Playgroud)

some_environment[5, 6]例如,这将允许您这样做.(您可能更愿意返回列,这取决于您的系统以及最适合您的方法).