【问题标题】:Nested list object does not support indexing嵌套列表对象不支持索引
【发布时间】:2012-10-14 09:17:14
【问题描述】:

我有一个嵌套列表,名为 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____setitem__ 方法,但无法让它们处理多维列表。我应该使用更好的数据结构来创建网格吗?

【问题讨论】:

    标签: python list object indexing


    【解决方案1】:

    这里的问题是你不能用__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]。 (您可能更愿意返回该列,这取决于您的系统以及最适合您的方式)。

    【讨论】:

      猜你喜欢
      • 2014-04-23
      • 2019-11-12
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2018-01-07
      • 2013-06-23
      • 2019-04-18
      相关资源
      最近更新 更多