Python 字典實現原理

tomcatdog發表於2020-11-22

虛擬碼

a = {}
a['key1'] = 1
a['key2'] = 6
del a ['key1']

底層實現

  1. Python直譯器 執行 a ={}
    Python直譯器讀到這裡,比如會給5個連續的記憶體空間,有5個連續的記憶體地址,可以放資料
  2. Python直譯器 執行 a[‘key1’] = 1
    這裡,Python直譯器會對key1進行雜湊運算,得到一個十位進位制的雜湊值,因為是5個位置,所以會對5取,就會得到0,1,2,3,4 五個位置,比如key1取餘得到 1 ,就會把值放進1位置上,這就叫雜湊位置對映也叫hashmap,但是會有一種情況,就是兩個key有可能算出一樣的雜湊值
  3. Python直譯器 執行a[‘key123’] = 6
    也有可能算出位置1,但是位置1被佔據了 ,這時候解析器會把key123雜湊出來的值,再加上key1的位置1,再進行雜湊,再取餘,就能得到一個新地址,放進去。
    刪除值呢?
    比如刪除
  4. Python直譯器 執行 del a = [‘key1’]
    那麼在查詢a[‘key123’]時候,因為雜湊出來的位置一樣,但是位置裡的內容為空,那麼會找不出值,傳送keyerror,如何解決?
    刪除時候,不會真刪除,而是會在這個位置加上標記,此處有人來過,那麼就會再拿出這個位置的索引值,再進行一次雜湊,找到位置,就能找出這個準確的值了,這就是解決雜湊碰撞的方法。

字典擴容

字典的擴容,是一旦少於總容量的三分之一,就會進行擴容,位置重新排,因為總長度變了,如果資料量一旦大起來,就浪費很大的三分之一,這也是這套演算法的缺點之一,用空間換取時間。所以字典不能做大資料儲存。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章