2017-04-23 10 views
4

python3.5のディクショナリに格納されているオブジェクトの順序は、インタプリタの実行によって変化しますが、同じインタプリタインスタンスの場合は同じです。なぜPython辞書の順序が変わるのですか?

$ python3 <(printf 'print({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})') 
{'b': 2, 'a': 1} 
{'b': 2, 'a': 1} 
{'b': 2, 'a': 1} 
{'b': 2, 'a': 1} 
$ python3 <(printf 'print({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})') 
{'a': 1, 'b': 2} 
{'a': 1, 'b': 2} 
{'a': 1, 'b': 2} 
{'a': 1, 'b': 2} 

私はいつも注文がキーのハッシュに基づいていると思っていました。なぜPythonの異なる実行間で順序が異なりますか?

+0

この質問に対する答えはそこに受け入れられた回答に脇に埋もれているように見えますが、私は質問が同じことを求めているとは思わない。 – Tobin

+0

はい、おそらくあなたは正しいです。だから私は以前の答えを元に戻しています。 –

答えて

2

辞書).keysの順序付きリストを(作る、順序を維持する

hash機能を使用して、順序はすべて右キーのハッシュに基づいてです。

しかし、this Q&Aに記載されているように、python 3.3から始めると、実行時にハッシュの種がランダムに選択されます(pythonのバージョンに依存しているわけではありません)。

のPython 3.3のように、ランダムなハッシュシードがサービス拒否の特定のタイプを(攻撃者は質量ハッシュ衝突を引き起こすことによって応答しないPythonのサーバをレンダリングする場合)を防止するために、ハッシュ衝突が予測不可能な作り、同様に使用されることに注意してください。つまり、与えられた辞書の順序は、現在のPython呼び出しのランダムハッシュシードにも依存します。

したがって、プログラムを実行するたびに異なる順序が得られることがあります。

ディクショナリの順序は保証されていないため(これはPython 3.6より前ではありません)、考慮する必要のない実装の詳細です。

-2

辞書は本質的に順序付けられていません。 「注文」の標準化された振る舞いが現実的ではないと予想している。

+0

それは問題ではありません。 –

+0

また、(collectionsモジュールから)OrderedDictを使いたいと思っています。 – Sawyer

関連する問題