почему xrange может вернуться к началу в Python?

Я встречал этот код из Самый питонический способ подсчета совпадающих элементов в чем-то итерируемом

r = xrange(1, 10)
print sum(1 for v in r if v % 2 == 0) # 4
print sum(1 for v in r if v % 3 == 0) # 3

r повторяется один раз. а потом снова повторяется. Я думал, что если итератор один раз используется, то все кончено, и его не следует повторять снова.

Выражения генератора могут повторяться только один раз:

r = (7 * i for i in xrange(1, 10))
print sum(1 for v in r if v % 2 == 0) # 4
print sum(1 for v in r if v % 3 == 0) # 0

enumerate(L) тоже:

r = enumerate(mylist)

и файловый объект тоже:

f = open(myfilename, 'r')

Почему xrange ведет себя иначе?

29
задан Community 23 May 2017 в 12:29
поделиться