2017-04-23 90 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

字典使用hash功能,以及基於關鍵沒事的散列順序

但是,正如在this Q&A某處所述,從蟒3.3開始,散列的種子在執行時隨機選擇(更不用說這取決於Python版本)。

注意,像Python 3.3的,隨機散列種子使用爲好,使散列衝突不可預測的,以防止某些類型的拒絕服務(其中攻擊者呈現一個Python服務器通過使質量哈希衝突響應)的。這意味着給定字典的順序也取決於當前Python調用的隨機散列種子。

因此,每次執行程序時,都可能得到不同的順序。

由於不能保證字典的順序(不是在python 3.6之前),所以這是一個你不應該考慮的實現細節。

-2

詞典本質上是無序的。期待「訂單」的任何標準化行爲是不現實的。

保持有序,使.keys的有序列表()

+0

這不是問題。 –

+0

此外,你會想使用OrderedDict(從集合模塊) – Sawyer

相關問題