2014-02-11 43 views
3

我在第一眼看Python wikibook的python語言。如果集合是無序的,爲什麼Python集合以「相同」順序顯示?

對於下文中提到的套 - We can also have a loop move over each of the items in a set. However, since sets are unordered, it is undefined which order the iteration will follow.

並給出了代碼示例

s = set("blerg") 

for letter in s: 
    print letter 

輸出

r b e l g 

當我運行該程序,我得到的結果不管我跑了多少次,都是一樣的順序。如果集合無序且迭代次序未定義,爲什麼它以相同的順序返回集合?訂單的基礎是什麼?

[PS:對不起,如果我誤解了一些非常基本的東西。我是一個蟒蛇新手]

+0

項目存儲的順序是無序的,但是這是一致的(至少在Python 2.x中)。 – thefourtheye

+0

訂單未定,但不是隨機的。以相同的順序插入的相同的一組值,將總是以相同的順序出現 –

+0

即,即。該文件告訴你:「不要相信事情是按照某種順序進行的,因爲你可能會(並且會感到驚訝)」。如果您需要訂購,則使用一些自定義設置(字典中有這樣的自定義)。 –

回答

11

它們不是隨機排列的,它們是任意排序的。這意味着您不應該依賴保持的插入順序,因爲實際的內部實現細節決定順序。

順序取決於組的插入和刪除歷史記錄。

在CPython中,集合使用一個哈希表,其中根據從hash()函數返回的值,將插入值插入稀疏表中,以表格大小和衝突處理算法爲模。列出設置內容然後按照此表中的順序返回值。

如果你想進入細節的技術細節,那麼看看Why is the order in dictionaries and sets arbitrary?;集合的核心是字典,其中的鍵是set值,並且沒有關聯的字典值。與往常一樣,實際的實現過程要複雜一點,但這個答案足以讓你獲得大部分的途徑。然後看看C source code for set的其他細節。

將此與列表進行比較,該列表具有可影響的固定訂單;您可以在列表中移動項目,併爲您保留新的順序。

+0

ahh de ja vu。這應該在文檔中就像這樣。 – Vader

+0

對於一個特定的集合,如果它沒有改變,集合與有序列表相同? – palerdot

+0

@Vader:不,它不應該:-)這是一個術語。文檔未定義的東西的含義是軟件工程中的一個常見概念。每個新手程序員首先將它放在不同的地方,這真是一個恥辱,但它不會幫助我們其他人在每次使用它時在世界的每一個文檔中詳盡地闡述它。 –

相關問題