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.但那没用.
我有两个错误:
我们在尝试执行时遇到的主要问题是addElement(2, 2)我收到此错误:
"TypeError: 'Environment' object does not support indexing.
我查看了__getitem__和__setitem__方法,但无法让它们在多维列表上工作.我应该使用更好的数据结构来创建网格吗?
这里的问题是你不能用它替换对象__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]例如,这将允许您这样做.(您可能更愿意返回列,这取决于您的系统以及最适合您的方法).