【问题标题】:Can you assign object instances directly to a list in Python?您可以将对象实例直接分配给 Python 中的列表吗?
【发布时间】:2013-01-12 10:39:37
【问题描述】:

我定义了一个名为 Space 的类,用于表示 9x9 板上的空间。我想在程序开始时生成 81 个实例,方法是将它们分配给我打算用作二维数组的列表元素。

课程如下:

class Space:
    def __init__(self, x_coord, y_coord):
        self.row = x_coord
        self.column = y_coord

这是我将实例分配给列表(也称为空间)的尝试之一:

for i in xrange(1,9):
   for j in xrange(1,9):
        space[i][j] = Space(i,j)

我的目标是能够使用列表索引来引用实例,就好像它们是坐标一样,即space[1][2].value = 3

我正在尝试做的事情可能吗?有没有更好的方法来批量生成实例?谢谢!

编辑:(我的回复以更易读的形式在下面)

脚本运行,但是当我尝试在命令提示符中访问它时,我的列表似乎没有定义

>>> space[1][2].value = 3
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
NameError: name 'space' is not defined
>>> space[1][1]
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
NameError: name 'space' is not defined

【问题讨论】:

  • 你的“尝试”有什么问题?
  • 请将您的回溯添加到您的问题中,以便我们阅读。
  • 嗯,这一个问题,但它是一个单独的问题。你在哪里定义了space?你已经在某个地方定义了它,对吧?
  • 听起来你想从list继承或者添加一个__getitem__函数。
  • 好吧,我以为我已经在space[i][j] = Space(i,j) 行中定义了它。话虽如此,我还在循环前添加了space = [],但没有帮助。

标签: python list class instance


【解决方案1】:

您必须使用基于 0 的索引,但这将实现您想要的:

space = [[Space(i,j) for j in range(9)] for i in range(9)]

【讨论】:

  • 这似乎与我的尝试有同样的问题:我可以运行脚本,但任何访问列表的尝试都会给我错误NameError: name 'space' is not defined
  • @smohyee: 你能给出一个更完整的例子吗?它通常表示您尚未在当前范围内定义“空间”。
  • 啊...上面也有一个错字(在 'i' 和 'range' 之间缺少 'in')。现已更正。
【解决方案2】:

听起来您从未创建过您试图用来保存Space 对象的space 列表。这是一种方法,从一个空列表开始,然后将值附加到列表中:

space = [] # initially empty list
for i in range(9):
    column = [] # create an empty list to hold a column of values
    for j in range(9):
        column.append(Space(i, j)) # add the object to the column
    space.append(column) # add the column to the outer list

一个更干净、更“Pythonic”的解决方案是使用嵌套的list comprehensions,正如isedev 的回答:

space = [[Space(i, j) for j in range(9)] for i in range(9)]

最后一点,在代码中对不同的事物使用相同的词,只是大小写不同可能是个坏主意。可以使用名为 foo 的变量来保存单个 Foo 实例,但更好的名称将表明该实例的用途,例如foo_for_frobbing。在您的情况下,对于您的 Space 实例列表,board 可能比 space 更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2015-07-15
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多