で列挙して行動し、python3.5.2奇妙な私はpython2.7.12に走った次のコードスニペットを持っているのpython3
f = open(file_name,'r')
file_data= f.read()
f.close()
char_list = list(set(file_data))
c = {char:i for i,char in enumerate(char_list)}
x = {i:char for i,char in enumerate(char_list)}
python2.7.12に走ったとき、私は期待した結果を得る:
{'a': 0, ' ': 1, 'e': 2, 'i': 3, 'h': 4, '\n': 5, 'o': 6, 'r': 7, 'u': 8, 'w': 9, 'y': 10, '?': 11}
{0: 'a', 1: ' ', 2: 'e', 3: 'i', 4: 'h', 5: '\n', 6: 'o', 7: 'r', 8: 'u', 9: 'w', 10: 'y', 11: '?'}
を
python3.5.2では、何か奇妙なことが起こります。私は時々のような結果を得る:python2.7.12 python3.5.2に、また
{'h': 1, 'e': 4, 'r': 2, 'i': 3, '?': 0, '\n': 5, ' ': 6, 'u': 7, 'a': 8, 'y': 9, 'o': 10, 'w': 11}
{0: '?', 1: 'h', 2: 'r', 3: 'i', 4: 'e', 5: '\n', 6: ' ', 7: 'u', 8: 'a', 9: 'y', 10: 'o', 11: 'w'}
をではなく、プログラムがchar_list
実行されるたびに異なるためです。これはpython2.7.12のたびに同じ順序で実行されます。
両方のバージョンのPythonでは、enumerate
は反復可能なオブジェクトを返します。
なぜこの奇妙な現象が起こっていますか?
P.S. char_list
のコピーを作成し、2番目の列挙型にコピーすると発生しますchar_list
Python dictsは注文されません。読みやすい出力をしたい場合は、項目を並べ替えます。 Python 3は特定の攻撃を緩和するためにdictの順序をランダム化し、 '-R'フラグを渡すか、環境で' PYTHONHASHSEED = random'を設定することでPython 2で同じことを有効にすることができます。 – Ryan
@Ryanよく、_technically_ Python 3.6用のCPythonインタプリタは辞書を注文しています。これは実装の詳細ですが、それに頼るべきではありません。 –
これは 'list(set)'の返り値にも当てはまりますか?それも無作為化されているようだ。 – dylan7