2

スニペット

 xi = xrange(10)
 zip(xi,xi)

 xi = iter(range(10))
 zip(xi,xi)

異なる振る舞いをします。私は得ることを期待した

  [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]

最初のスニペットでも同様ですが、返されます

[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]

代わりは。暗黙のコンテナが静かにコピーされているようです。誰かがここで何が起こっているのか説明できますか? そのようなセマンティクスを選択する背後にある推論。

>>> sys.version
'2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)]'
4

3 に答える 3

1

xrange はイテレータではありません。人々はそれをジェネレーターと呼び続けていますが、そうではありません。xrange はタプルのような不変のシーケンスです:

>>> x = xrange(5)
>>> x[2]
2
>>> for i in x:
...     print i
...
0
1
2
3
4
>>> for i in x:
...     print i
...
0
1
2
3
4

他のシーケンス タイプと同様に、xrange から反復子を要求するたびに、新しい独立した反復子が取得されます。したがって、それ自体で圧縮すると、それ自体で圧縮した場合ではなく、それ自体でxrange(10)圧縮した場合と同じ出力が得られます。[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]iter([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

于 2015-06-26T08:04:25.473 に答える
1

xrange オブジェクトはイテレータではなく、イテラブル オブジェクトです。関数に渡すことでイテレータを取得しますiter。このzip関数はiterすべての引数を暗黙的に呼び出すため、xrange オブジェクトに対して 2 つの並列反復子が生成されます。2 番目の例では、手動で 1 回呼び出しiterているため、リンゴとオレンジを比較しています。に対しても必要な効果を得るにはxrange、次のことを行う必要があります

In [5]: it = iter(xrange(10))
   ...: zip(it, it)
Out[5]: [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
于 2015-06-26T07:55:38.643 に答える