Python 2.7 與 Python 3.3 中的字典排序:為什麼會改變?
在 Python 2.7 中,字典鍵的排序是任意但一致的。然而,這種行為在 Python 3.3 中發生了變化,從 vars() 等方法獲得的鍵的順序似乎是不確定的。
這種不確定性源自於 2012 年實現的安全性修復,該修復預設啟用在Python 3.3。該修復引入了哈希隨機化以防止某些安全漏洞。結果,字典和集合的迭代順序變得不可預測。
在 Python 3.6 中,引入了 dict 類別的新實作來保留插入順序。因此,從 Python 3.7 開始,字典的順序保留行為現在得到了保證。
某些用例中的意外一致性
儘管排序是不確定的,但仍有維持一致秩序的情況。例如:
list({str(i): i for i in range(10)}.keys())
在Python 2.7 和Python 3.6(及更高版本)中,此表達式總是產生順序:
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
這是因為反例使用集合理解,其中建立一個隱式有序字典。然而,在 Python 3.3 中,由於處理雜湊衝突的限制,順序可能仍然會有所不同。
以上是為什麼 Python 2.7 和 3.3 之間的字典排序行為會變化,以及後來如何演變?的詳細內容。更多資訊請關注PHP中文網其他相關文章!