Python ジェネレーター式の反復順序が、類似のリスト内包表記およびジェネレーター関数とは異なるように見える例があります。
たとえば、コード
n = 10
d = {i : str(i) for i in range(n)}
for i in d:
print d[i],
print
def func_gen(d):
for i in range(n):
yield d[i]
print(list(func_gen(d)))
g = [d[i] for i in range(n)]
print(g)
g = {d[i] for i in range(n)}
print(list(g))
出力があります
0 1 2 3 4 5 6 7 8 9
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
['1', '0', '3', '2', '5', '4', '7', '6', '9', '8']
リスト内包表記の場合と同様に、ジェネレーター式が順序付けられた出力を生成することを期待します。順序が保証されていないと言うジェネレータ式について何かありますか?
構造はほぼ同じなのに、ジェネレーター式の順序が他のものと異なるのはなぜですか? 辞書を反復するのと同じ順序でさえないので、それを延期しているようには見えません。
Python 2 と 3 で同じ動作が見られます。