您可以将对象实例直接分配给Python中的列表吗?

时间:2013-01-28 23:21:01

标签: python list class instance

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

这是班级:

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

2 个答案:

答案 0 :(得分: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。在您的情况下,对于board个实例列表,space可能比Space更好。

答案 1 :(得分:0)

您必须使用基于0的索引,但这将达到您想要的效果:

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