Что произойдет, если мы остановим итерацию до того, как объект-генератор вызовет исключение StopIteration - PullRequest
5 голосов
/ 08 мая 2020

У меня есть объект generator, который проверяет определенное условие в списке. Эта программа отлично работает во всех моих случаях.

Но я просто хочу прояснить некоторые ключевые моменты.

В моей программе Всякий раз, когда generator yield значения 'No' или 'Done', управляющая итерация останавливается и вызывает generator с другим аргументом.

Это может быть глупый вопрос, в любом случае, когда объект generator уступает место и мы перестаем вызывать рядом с ним, разрешается ли этот объект для сбора мусора? Или этот полученный объект обрабатывается для сборки мусора, когда мы снова вызываем его generator с другим аргументом.

Пожалуйста, поясните мне, что происходит с объектом generator, если мы перестанем вызывать next() на перед тем, как вызвать исключение StopIteration. Что происходит с постоянными точками выполнения и переменными текущего generator объекта, когда мы снова вызываем генератор с новым аргументом.

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Я обсуждал вопрос о том, чтобы сделать это комментарием, потому что я не эксперт по деталям реализации G C в Python, но решил ответить, поскольку кажется, что это может быть полезно.

I Думаю, сборщик мусора происходит только тогда, когда вы теряете все ссылки на него, но это не имеет значения, поскольку генераторы обычно используются, чтобы не хранить материал в памяти, поэтому они обычно не очень большие. Я думаю, что это нормально прекратить использовать его, пока он не достиг StopIteration. Фактически, многие генераторы никогда не вызывают StopIteration (например, если они перечисляют некоторую бесконечную серию), поэтому во многих случаях ожидается, что вы перестанете вызывать next до того, как достигнете «конца».

0 голосов
/ 08 мая 2020

Хороший вопрос и я тоже следил за этим топом c, как никогда не сталкивался. Обнаруживается следующее: когда кадр генератора запускается (повторно) (или, как вы сказали, ситуация остановки) в результате вызова next () (или send () или throw ()), один возможны три результата:

  • Достигнут предел текучести, и возвращается полученное значение.
  • Кадр возвращается из; Возникает StopIteration.
  • Возникает исключение, которое всплывает.
  • В последних двух случаях кадр игнорируется (и для атрибута gi_frame объекта-генератора установлено значение None). Это касается генераторов: когда внутри генератора возникает StopIteration, он заменяется на RuntimeError по указанным выше причинам.

Пожалуйста, посмотрите дополнительные подробности. спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...