Следующий код создает некоторые очень странные результатыПреобразование итератора в список изменений итератор
import re
string = "test test test"
positions = re.finditer("test", string)
print (list(positions))
print (list(positions))
Выход:
[<Match object...>, <Match object...>, <Match object...>]
[]
Теперь, я думаю, что я знаю, что здесь происходит. Первый list
вызывает «исчерпает» итератор (поэтому он «использует итератор вверх», как в генераторе, в процессе создания списка из итератора), поэтому, когда сделан второй вызов list
, итератор ушел и мы получаем пустой список. Это, похоже, подтверждается абзацем ниже, хотя я пытаюсь понять некоторые из вещей, которые они здесь приводят, поэтому я не совсем доволен этим объяснением (если он является правильным):
Объект-контейнер (например, список) создает новый новый итератор каждый раз, когда вы передаете его функции iter() или используете его в цикле for. Попытка этого с помощью итератора будет возвращать тот же исчерпанный объект итератора , который использовался в предыдущем проходе итерации, заставляя его отображаться как пустой контейнер.
Вышеупомянутый абзац от the official documentation.
Я не совсем понимаю, что они говорят в первом предложении в предыдущем абзаце, особенно в отношении перехода к функции iter()
, и я не знаю, как они соединяют использование в цикле for с списком, создающим новый новый итератор. Второе предложение, тем не менее, похоже на то, о чем я думал в коде выше.
Если кто-нибудь может помочь мне разобраться в путанице здесь, я был бы очень признателен.
Примечание:
Я использую Python 3.5.1
одноразовый итератор? –
Да.Вы можете только повторить его один раз. – wim
Хорошо, но это было в значительной степени тем, что я сказал, что я уже думал (что он истощает итератор в первый раз, а затем второй раз). Но, не смотря на это, я думаю, что я понял, что говорится в моем параграфе в моем вопросе. –