Mark Tolonen が簡潔なコメントで指摘したように、あなたの itertools の試行が無期限に繰り返される理由は、リストの割り当てのために、python が右側の長さをチェックしているためです。
では、本格的に掘り下げていきます...
あなたが言う時:
x[::2] = itertools.repeat(False)
左側 ( ) はリストであり、値がiterable でx[::2]
あるリストに値を割り当てています。これは、長さが指定されていないため、永遠に反復されます ( docsに従って)。itertools.repeat(False)
cPython 実装のリスト割り当てコードを掘り下げると、残念ながら/痛々しい名前の function が見つかります。list_ass_slice
これは、多くのリスト割り当てのルートにあります。そのコードには、次のセグメントが表示されます。
v_as_SF = PySequence_Fast(v, "can only assign an iterable");
if(v_as_SF == NULL)
goto Error;
n = PySequence_Fast_GET_SIZE(v_as_SF);
ここではn
、リストに割り当てている iterable の長さ ( ) を取得しようとしています。ただし、そこにたどり着く前に に行き詰まりPySequence_Fast
、PySequence_List
最終的には空のリストを作成し、反復可能オブジェクトで単純に拡張しようとします。
iterable を使用してリストを拡張するにはlistextend()
、 を使用します。そこに問題の根本が表示されます。
/* Run iterator to exhaustion. */
for (;;) {
そして、そこに行きます。
または、少なくともそう思います... :) 興味深い質問だったので、ソースを掘り下げて何が起きているのかを調べて、そこにたどり着いたと思いました。
numpy 配列での動作の違いに関しては、numpy.array
割り当ての処理方法が異なるだけです。
itertools.repeat
usingはnumpyでは機能しませんが、ハングアップしないことに注意してください(理由を理解するために実装をチェックしませんでした):
>>> import numpy, itertools
>>> x = numpy.ones(10,dtype='bool')
>>> x[::2] = itertools.repeat(False)
>>> x
array([ True, True, True, True, True, True, True, True, True, True], dtype=bool)
>>> #but the scalar assignment does work as advertised...
>>> x = numpy.ones(10,dtype='bool')
>>> x[::2] = False
>>> x
array([False, True, False, True, False, True, False, True, False, True], dtype=bool)