欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 的字典(Dict)是如何存儲(chǔ)的

 更新時(shí)間:2019年07月05日 15:17:05   作者:keeeeeenon  
這篇文章主要介紹了Python 的字典(Dict)是如何存儲(chǔ)的,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

Python 的字典有好多個(gè)名稱("映射"、"哈希"、"散列"或者"關(guān)系數(shù)組"),那你知道為什么字典會(huì)被稱為 Hash(翻譯為"哈希"或"散列")嗎?

你知道為什么字典對(duì)于鍵(Key)的存儲(chǔ)數(shù)據(jù)要求比較嚴(yán)格,但對(duì)于對(duì)應(yīng)的值(Value)的存儲(chǔ)卻要求很寬松嗎?

讀完這篇文章,你將深刻理解這些問(wèn)題背后的真相!

hash

首先我們來(lái)解釋一下什么是 Hash,來(lái)自維基百科:

散列函數(shù)(或散列算法,又稱哈希函數(shù),英語(yǔ):Hash Function)是一種從任何一種數(shù)據(jù)中創(chuàng)建小的數(shù)字“指紋”的方法。散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小,將數(shù)據(jù)的格式固定下來(lái)。該函數(shù)將數(shù)據(jù)打亂混合,重新創(chuàng)建一個(gè)叫做散列值的指紋。散列值通常用來(lái)代表一個(gè)短的隨機(jī)字母和數(shù)字組成的字符串。好的散列函數(shù)在輸入域中很少出現(xiàn)散列沖突。在散列表和數(shù)據(jù)處理中,不抑制沖突來(lái)區(qū)別數(shù)據(jù),會(huì)使得數(shù)據(jù)庫(kù)記錄更難找到。

世界上沒(méi)有兩片完全相同的樹(shù)葉,也沒(méi)有兩個(gè)相同的指紋,散列函數(shù)是用于從數(shù)據(jù)中創(chuàng)建小的數(shù)字指紋的方法。

我們看下圖示:

如圖,Python 調(diào)用內(nèi)部的散列函數(shù),將鍵(Key)作為參數(shù)進(jìn)行轉(zhuǎn)換,得到一個(gè)唯一的地址(這也就解釋了為什么給相同的鍵賦值會(huì)直接覆蓋的原因,因?yàn)橄嗤逆I轉(zhuǎn)換后的地址是一樣滴),然后將值(Value)存放到該地址中。

對(duì)于 Python 來(lái)說(shuō),鍵(Key)必須是可哈希的,換句話說(shuō)就是要可以通過(guò)散列函數(shù)計(jì)算出唯一地址的。那如果拿一個(gè)變量當(dāng)鍵(Key)可以嗎?肯定不行。因?yàn)樽兞侩S時(shí)都可能改變,不符合可哈希原則!

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

那有朋友可能會(huì)問(wèn),那元祖呢?元祖總該是不變的吧?

其實(shí)不然,因?yàn)樵胬镞吙梢源娣帕斜磉@類可變因素,所以如果實(shí)在想拿元祖當(dāng)字典的鍵(Key),那必須對(duì)元祖做限制:元組中只包括像數(shù)字和字符串這樣的不可變?cè)貢r(shí),才可以作為字典中有效的鍵(Key)。

另外還需要注意的一點(diǎn)是,Python 的哈希算法對(duì)相同的值計(jì)算得到的結(jié)果是一樣的,也就是說(shuō) 12315 和 12315.0 的值相同,他們被認(rèn)為是相同的鍵(Key)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python導(dǎo)入數(shù)值型Excel數(shù)據(jù)并生成矩陣操作

    Python導(dǎo)入數(shù)值型Excel數(shù)據(jù)并生成矩陣操作

    這篇文章主要介紹了Python導(dǎo)入數(shù)值型Excel數(shù)據(jù)并生成矩陣操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • 詳談套接字中SO_REUSEPORT和SO_REUSEADDR的區(qū)別

    詳談套接字中SO_REUSEPORT和SO_REUSEADDR的區(qū)別

    下面小編就為大家分享一篇詳談套接字中SO_REUSEPORT和SO_REUSEADDR的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • 詳解Python中正則匹配TAB及空格的小技巧

    詳解Python中正則匹配TAB及空格的小技巧

    這篇文章主要介紹了詳解Python中正則匹配TAB及空格的小技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python如何構(gòu)建mock接口服務(wù)

    python如何構(gòu)建mock接口服務(wù)

    這篇文章主要介紹了python如何構(gòu)建mock接口服務(wù),幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • Python中的多行注釋文檔編寫風(fēng)格匯總

    Python中的多行注釋文檔編寫風(fēng)格匯總

    在Python中利用多行注釋編寫小型的程序文檔說(shuō)明非常方便,而約定俗成的格式也多種多樣,這里我們就進(jìn)行一下最常見(jiàn)的Python中的多行注釋文檔編寫風(fēng)格匯總:
    2016-06-06
  • 一文帶你掌握Python中文詞頻統(tǒng)計(jì)

    一文帶你掌握Python中文詞頻統(tǒng)計(jì)

    詞頻統(tǒng)計(jì)是指在文本中計(jì)算每個(gè)詞出現(xiàn)的次數(shù)。這篇文章主要帶大家了解一下Python實(shí)現(xiàn)中文詞頻統(tǒng)計(jì)的方法,感興趣的小伙伴可以了解一下
    2023-02-02
  • 一行代碼讓 Python 的運(yùn)行速度提高100倍

    一行代碼讓 Python 的運(yùn)行速度提高100倍

    python一直被病垢運(yùn)行速度太慢,但是實(shí)際上python的執(zhí)行效率并不慢,慢的是python用的解釋器Cpython運(yùn)行效率太差。這篇文章主要介紹了一行代碼讓 Python 的運(yùn)行速度提高100倍的相關(guān)知識(shí),需要的朋友可以參考下
    2018-10-10
  • python中numpy基礎(chǔ)學(xué)習(xí)及進(jìn)行數(shù)組和矢量計(jì)算

    python中numpy基礎(chǔ)學(xué)習(xí)及進(jìn)行數(shù)組和矢量計(jì)算

    這篇文章主要給大家介紹了python中numpy基礎(chǔ)知識(shí),以及進(jìn)行數(shù)組和矢量計(jì)算的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-02-02
  • python中實(shí)現(xiàn)詞云圖的示例

    python中實(shí)現(xiàn)詞云圖的示例

    這篇文章主要介紹了python中實(shí)現(xiàn)詞云圖的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • pytorch 禁止/允許計(jì)算局部梯度的操作

    pytorch 禁止/允許計(jì)算局部梯度的操作

    這篇文章主要介紹了pytorch 禁止/允許計(jì)算局部梯度的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05

最新評(píng)論