Прохождение через генератор в Python 3 (например, игра в шахматы) - PullRequest
0 голосов
/ 16 сентября 2018

Мой вопрос касается понимания генераторов, а не взаимодействия с шахматной игрой, которую я использую только в качестве примера.

Это создает генератор, представляющий шахматную игру:

>>> from chess import pgn

>>> a_game = pgn.read_game(open('achessgame.pgn')) #importing game from a file

А потом я пытаюсь пройтись по игре, но она всегда возвращает 1-й ход:

>>> 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() в 1-м случае продолжает выводить 1-й ход, а генератор a во 2-х шагах игры?И a_game.main_line, и a являются генераторами, но почему они не ведут себя одинаково?

1 Ответ

0 голосов
/ 17 сентября 2018

@ Джоншарп прав.Python (и каждый язык) заботится об идентичности объекта, а не только о его значении.Когда вы вызываете a_game.main_line(), вы получаете новый генератор с собственным набором объектов (Move с).Когда вы присваиваете его переменной (a), вы сохраняете тот же генератор, а не создаете новый, поэтому он будет продолжаться.

...