2017-06-11 46 views
0

我是編程新手,但我一直在深入研究,現在我正在學習一本名爲Head First Python的書。它說,字典是可變的,但是無序的數據結構,無論你何時返回或打印所述數據結構,鍵/值對都將保持不變,但它們出現的順序不會。現在是辭典嗎?

但是,我注意到無數次運行IDLE時,每當我返回或打印一本字典時,它都會以與最初生成或生成/迭代循環完全相同的順序出現。這可能是Python 2和Python 3之間的區別嗎?這是一個新的更新?它可能只是IDE?這並不重要,但我對答案非常感興趣。

+1

哪個版本?什麼字典?整數散列爲自己,所以在用作鍵時出現有序,從3.6字典保留插入順序。關鍵是你通常不應該依靠任何特定的順序。 – jonrsharpe

+0

不是一個愚蠢的,但https://stackoverflow.com/questions/39980323/dictionaries-are-ordered-in-python-3-6 – Uriel

回答

3

在Python 3.6中,更新了Python字典的實現,使它們更有效地利用內存。作爲這項工作的副作用,他們現在還保留插入順序。

這仍被視爲實施細節;未來版本的Python 可能會強制要求dict保留順序。見What's New in Python 3.6 documentation

訂單保留這個新的執行方面被認爲是一個實現細節,也不應(這可能在未來改變的依據,但它需要有在這個新的字典實現在改變語言規範以強制所有當前和將來的Python實現的順序保留語義之前,這也有助於保持與舊版本語言的向後兼容,其中隨機迭代順序仍然有效,例如Python 3.5) 。

如果您沒有使用Python 3.6(或更新版本),並且看到似乎是一個有序的按鍵序列,那麼您正在尋找一個巧合。用作鍵的整數通常看起來是有序的,因爲它們的散列值與整數的值(對於除一個邊緣情況之外的所有情況都是1對1)有直接關係,如果你有小的話它們將以相同的順序被分割整數:

>>> import sys 
>>> sys.version_info 
sys.version_info(major=2, minor=7, micro=13, releaselevel='final', serial=0) 
>>> {1: 'foo', 3: 'bar', 5: 'spam'} 
{1: 'foo', 3: 'bar', 5: 'spam'} 

請參閱Why is the order in dictionaries and sets arbitrary?瞭解其原因的簡要概述。

Python 3.7已將此實現細節提升爲Python語言規範。這意味着語言的所有符合實施必須保留字典中的插入順序。