1. 程式人生 > 實用技巧 >20201011 048.字典_核心底層原理_記憶體分析_儲存鍵值對過程

20201011 048.字典_核心底層原理_記憶體分析_儲存鍵值對過程

字典核心底層原理(重要)

字典物件的核心是散列表。散列表是一個稀疏陣列(總是有空白元素的陣列),陣列的每個單元叫做 bucket。每個 bucket 有兩部分:一個是鍵物件的引用,一個是值物件的引用。

由於所有 bucket 結構和大小一致,我們可以通過偏移量來讀取指定 bucket。

將一個鍵值對放進字典的底層過程

>>> a = {}

>>>

a["name"] = "gaoqi"

假設字典 a 物件建立完後,陣列長度為 8:

我們要把”name”=”gaoqi”這個鍵值對放到字典物件 a 中,首先第一步需要計算鍵”name”的雜湊值。Python 中可以通過 hash()來計算

>>> bin(hash("name"))

'-0b1010111101001110110101100100101'

由於陣列長度為 8,我們可以拿計算出的雜湊值的最右邊 3 位數字作為偏移量,即“101”,十進位制是數字 5。我們檢視偏移量 5,對應的 bucket 是否為空。如果為空,則將鍵值對放進去。如果不為空,則依次再取右邊 3 位作為偏移量,即“100”,十進位制是數字4。再檢視偏移量為 4 的 bucket 是否為空。直到找到為空的 bucket 將鍵值對放進去。流程圖如下:

擴容

python 會根據散列表的擁擠程度擴容。

“擴容”指的是:創造更大的陣列,將原有內容拷貝到新陣列中。散列表佔用接近 2/3 時,陣列就會擴容。