1. ホーム
  2. python

[解決済み] Pythonのリストイテレータの動作とnext(iterator)

2022-03-01 18:15:50

質問

考えてみてください。

>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2

ですから、イテレータを進めることは、予想通り、その同じオブジェクトをミューティングすることで処理されます。

ということであれば、期待できます。

a = iter(list(range(10)))
for i in a:
   print(i)
   next(a)

を呼び出すと、2つ目の要素ごとにスキップされます。 next はイテレータを一度進め、ループによる暗黙の呼び出しで二度目を進める必要があります。 i .

そうではありません。ループは次のように表示します。 すべて をスキップすることなく、リスト内の項目を表示します。

最初に考えたのは、ループが iter を渡すと、独立したイテレータが生成されるかもしれません。 iter(a) is a .

では、なぜ next は、この場合イテレータを前進させないように見えるのでしょうか?

解決方法は?

あなたが見ているのは インタプリタ の戻り値をエコーバックしています。 next() に加えて i が繰り返し表示されます。

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    next(a)
... 
0
1
2
3
4
5
6
7
8
9

だから 0 の出力です。 print(i) , 1 からの戻り値 next() 対話型インタープリタによってエコーされる、など。ちょうど5回の反復があり、各反復で2行がターミナルに書き込まれることになります。

の出力を next() は期待通りに動作します。

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    _ = next(a)
... 
0
2
4
6
8

または印刷 エクストラ を区別するための情報を提供します。 print() の出力をインタラクティブなインタプリタのエコーと区別する。

>>> a = iter(list(range(10)))
>>> for i in a:
...    print('Printing: {}'.format(i))
...    next(a)
... 
Printing: 0
1
Printing: 2
3
Printing: 4
5
Printing: 6
7
Printing: 8
9

言い換えると next() は期待通りに動作していますが、インタラクティブ・インタープリタによってエコーされたイテレータから次の値を返しているため、ループは何らかの形で自身のイテレータコピーを持っていると思わせてしまいます。