单步执行Python 3中的生成器(例如代表国际象棋游戏)

问题描述 投票:0回答:1

我的问题是关于理解生成器,而不是与国际象棋游戏的交互,我只是用它作为例子。

这创建了一个代表国际象棋游戏的生成器:

>>> 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_linea都是发电机,但为什么它们的行为却不一样?

python python-3.x generator
1个回答
0
投票

@jonrsharpe是对的。 Python(和每种语言)都关心对象的身份,而不仅仅是它的价值。当你调用a_game.main_line()时,你会得到一个新的生成器,它有自己的一组对象(Moves)。当您将其分配给变量(a)时,您将保留相同的生成器而不是创建新的生成器,因此它将继续。

© www.soinside.com 2019 - 2024. All rights reserved.