1

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 で同じ動作が見られます。

4

1 に答える 1

0

辞書は順序付けされていません。関数呼び出し間であっても、アイテムが特定の順序で戻ってくることに依存することはできません。

于 2015-01-30T00:31:16.307 に答える