我的问题是关于理解生成器,而不是与国际象棋游戏的交互,我只是用它作为例子。
这创建了一个代表国际象棋游戏的生成器:
>>> from chess import pgn
>>> a_game = pgn.read_game(open('achessgame.pgn')) #importing game from a file
然后,我尝试逐步完成游戏,但它总是返回第一步:
>>> next(a_game.main_line())
Move.from_uci('e2e4')
>>> next(a_game.main_line())
Move.from_uci('e2e4')
但是,这就是它实际的步骤:
a = a_game.main_line()
>>> next(a)
Move.from_uci('e2e4')
>>> next(a)
Move.from_uci('e7e5')
为什么第一种情况下的next()
继续输出第一步,但是第二步中的发生器a
通过游戏? a_game.main_line
和a
都是发电机,但为什么它们的行为却不一样?
@jonrsharpe是对的。 Python(和每种语言)都关心对象的身份,而不仅仅是它的价值。当你调用a_game.main_line()
时,你会得到一个新的生成器,它有自己的一组对象(Move
s)。当您将其分配给变量(a
)时,您将保留相同的生成器而不是创建新的生成器,因此它将继续。