イテレーターで生成されたオブジェクトを変数にセットして実行できるが、これをそのまま再度利用することはできない。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from itertools import repeat rpt = repeat("Ha", 3) for x in rpt: print(x, end="") print() # HaHaHa for x in rpt: print(x) print() # nothing displayed |
イテレーターはインスタンス生成時に__init__()
メソッドにより初期化され、その後イテレーターとして使用が終わった直後の値を保持している。正確には、再利用が禁止されているのではなく初期状態から再度実行することができない、ということになる。
たとえば次の例を見ると、最初の実行が終わったのちに再度利用することは不可能ではない。ただし結果を見るとわかるように、2度目の実行の初期値が1度目の終了判定時の値4ではなく5から始まっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from itertools import count cnt = count(0) for x in cnt: if x > 3: break print(x, end=" ") print() # 0 1 2 3 for x in cnt: if x > 7: break print(x, end=" ") print() # 5 6 7 |
おそらくcountイテレーターの__next__()
メソッドの最初で内部カウンターをインクリメントしていると考えられる。
このようにイテレーターの再利用は予想外の動作をすることがあるので控えた方がよさそうだ。