Python リストイテレータの動作と next(iterator) 質問する

Python リストイテレータの動作と next(iterator) 質問する

考慮する:

>>> 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イテレータを 1 回進め、次にループによって暗黙的に呼び出されるときにイテレータを 2 回進めます。そして、この 2 回目の呼び出しの結果が に割り当てられますi

そうではありません。ループは印刷します全てリスト内の項目をすべてスキップせずに実行します。

最初に考えたのは、ループがiter渡されたものを呼び出し、独立した反復子を生成するためにこれが起こるのではないかということでした。しかし、実際にはそうではありませんiter(a) is a

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

ベストアンサー1

あなたが見ているのは通訳者各反復で出力される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

In other words, next() is working as expected, but because it returns the next value from the iterator, echoed by the interactive interpreter, you are led to believe that the loop has its own iterator copy somehow.

おすすめ記事