1. 程式人生 > >你知道 Python 的字典(Dict)是如何儲存的嗎?

你知道 Python 的字典(Dict)是如何儲存的嗎?

Python 的字典有好多個名稱("對映"、"雜湊"、"雜湊"或者"關係陣列"),那你知道為什麼字典會被稱為 Hash(翻譯為"雜湊"或"雜湊")嗎?

你知道為什麼字典對於鍵(Key)的儲存資料要求比較嚴格,但對於對應的值(Value)的儲存卻要求很寬鬆嗎?

讀完這篇文章,你將深刻理解這些問題背後的真相!

首先我們來解釋一下什麼是 Hash,來自維基百科:
 

雜湊函式(或雜湊演算法,又稱雜湊函式,英語:Hash Function)是一種從任何一種資料中建立小的數字“指紋”的方法。雜湊函式把訊息或資料壓縮成摘要,使得資料量變小,將資料的格式固定下來。該函式將資料打亂混合,重新建立一個叫做雜湊值的指紋。雜湊值通常用來代表一個短的隨機字母和數字組成的字串。好的雜湊函式在輸入域中很少出現雜湊衝突。在散列表和資料處理中,不抑制衝突來區別資料,會使得資料庫記錄更難找到。


世界上沒有兩片完全相同的樹葉,也沒有兩個相同的指紋,雜湊函式是用於從資料中建立小的數字指紋的方法。

我們看下圖示:
 

 

如圖,Python 呼叫內部的雜湊函式,將鍵(Key)作為引數進行轉換,得到一個唯一的地址(這也就解釋了為什麼給相同的鍵賦值會直接覆蓋的原因,因為相同的鍵轉換後的地址是一樣滴),然後將值(Value)存放到該地址中。

對於 Python 來說,鍵(Key)必須是可雜湊的,換句話說就是要可以通過雜湊函式計算出唯一地址的。那如果拿一個變數當鍵(Key)可以嗎?肯定不行。因為變數隨時都可能改變,不符合可雜湊原則!

同樣的,列表、字典、集合這些都是可變的,所以都不能做為鍵(Key)來使用。

那有朋友可能會問,那元組呢?元組總該是不變的吧?

其實不然,因為元祖裡邊可以存放列表這類可變因素,所以如果實在想拿元祖當字典的鍵(Key),那必須對元祖做限制:元組中只包括像數字和字串這樣的不可變元素時,才可以作為字典中有效的鍵(Key)。

另外還需要注意的一點是,Python 的雜湊演算法對相同的值計算得到的結果是一樣的,也就是說 12315 和 12315.0 的值相同,他們被認為是相同的鍵(Key)。


嗯,這就是事情的真相,如果這篇文章讓你學習到信知識,可以點下邊“評分”作為獎勵哦^_^