可以直接将对象实例赋值给Python中的列表吗?
我定义了一个叫做Space的类,目的是用来表示一个9x9棋盘上的每个格子。我想在程序开始的时候生成81个这个类的实例,并把它们放到一个列表里,这个列表我打算用作一个二维数组。
这是我定义的类:
class Space:
def __init__(self, x_coord, y_coord):
self.row = x_coord
self.column = y_coord
这是我尝试把实例放到列表中的一个方法(这个列表也叫space):
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
你需要使用从0开始的索引方式,但这样做就能达到你想要的效果:
space = [[Space(i,j) for j in range(9)] for i in range(9)]
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
一种更简洁、更符合“Python风格”的解决方案是使用嵌套的 列表推导,就像isedev的回答那样:
space = [[Space(i, j) for j in range(9)] for i in range(9)]
最后要提一下,在代码中用同一个词但只改变大小写来表示不同的东西,可能不是个好主意。用一个叫 foo
的变量来存放一个单独的 Foo
实例是可以的,但更好的做法是用一个能说明这个实例用途的名字,比如 foo_for_frobbing
。在你的情况下,board
可能比 space
更适合用作存放 Space
实例的列表名称。