Это потому, что data
- итератор, вы можете использовать итератор только один раз. Например:
lst = [1, 2, 3]
it = iter(lst)
next(it)
=> 1
next(it)
=> 2
next(it)
=> 3
next(it)
=> StopIteration
Если мы перемещаем некоторые данные с помощью цикла for
, последний StopIteration
приведет к его завершению в первый раз. Если мы снова попытаемся перебрать его , мы будем получать исключение StopIteration
, потому что итератор уже был использован.
Теперь для второго вопроса: что делать, если нам do нужно переходить через итератор более одного раза? Простым решением было бы создать список с элементами, и мы можем проходить его столько раз, сколько необходимо. Это все в порядке, если в списке несколько элементов:
data = list(db[3])
Но если есть много элементов, лучше создать независимые итераторы, используя tee()
:
import itertools
it1, it2 = itertools.tee(db[3], n=2) # create as many as needed
Теперь мы можем поочередно перебирать по очереди:
for e in it1:
print("doing this one time")
for e in it2:
print("doing this two times")