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