最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中setdefault方法以及底層原理分析

 更新時(shí)間:2026年03月24日 16:05:27   作者:還是那個(gè)同偉偉  
這篇文章主要介紹了python中setdefault方法以及底層原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1、setdefault 方法 功能

setdefault是Python中字典的一個(gè)方法, 它用于在字典中查找指定鍵 如果鍵存在, 則返回對(duì)應(yīng)的值; 如果鍵不存在,則在字典中添加該鍵,并將其值設(shè)置為指定的默認(rèn)值

2、setdefault 用法詳解

dict.setdefault(key, default_value)

其中,key為要查找或添加的鍵,default_value為鍵不存在時(shí)設(shè)置的默認(rèn)值。

如果省略default_value,則默認(rèn)為None。

3、setdefault 底層原理

  • 底層實(shí)現(xiàn):

在Python中,字典是一種無(wú)序的鍵值對(duì)集合,它的底層實(shí)現(xiàn)是基于哈希表。

哈希表是一種根據(jù)關(guān)鍵字直接訪問(wèn)內(nèi)存位置的數(shù)據(jù)結(jié)構(gòu),通過(guò)哈希函數(shù)將關(guān)鍵字映射到對(duì)應(yīng)的內(nèi)存位置。

Python中的字典是通過(guò)拉鏈法(chaining)實(shí)現(xiàn)的哈希表。

拉鏈法是指每個(gè)哈希桶(bucket)(下方有解釋)中存儲(chǔ)一個(gè)鏈表,哈希值相同的鍵值對(duì)會(huì)被 插入到同一個(gè)鏈表中。當(dāng)需要查找或插入一個(gè)鍵值對(duì)時(shí),先計(jì)算出該鍵的哈希值,然后根據(jù)哈希值找到對(duì)應(yīng)的哈希桶,再在該哈希桶對(duì)應(yīng)的鏈表中查找或插入鍵值對(duì)。

下面是setdefault方法的底層實(shí)現(xiàn)步驟:

  • 計(jì)算要查找或添加的鍵的哈希值,找到對(duì)應(yīng)的哈希桶。
  • 遍歷哈希桶對(duì)應(yīng)的鏈表,查找是否有鍵與要查找或添加的鍵相同。
  • 如果找到了相同的鍵,則返回該鍵對(duì)應(yīng)的值。
  • 如果沒(méi)有找到相同的鍵,則在鏈表頭部添加一個(gè)新的鍵值對(duì),并將鍵的值設(shè)置為默認(rèn)值。
  • 返回默認(rèn)值作為該鍵的值。

上面中什么是哈希桶?

?哈希桶是哈希表中存儲(chǔ)元素的容器,它是一個(gè)固定大小的數(shù)組,每個(gè)元素都是一個(gè)鏈表或其他容器。

哈希桶的大小是根據(jù)哈希表的負(fù)載因子(load factor)和哈希表中元素?cái)?shù)量來(lái)計(jì)算的。

在Python中,哈希桶是一個(gè)由哈希表實(shí)現(xiàn)的動(dòng)態(tài)數(shù)組,每個(gè)哈希桶中存儲(chǔ)的是一條鏈表,鏈表中的每個(gè)節(jié)點(diǎn)都是一個(gè)鍵值對(duì)。

當(dāng)需要查找或插入一個(gè)鍵值對(duì)時(shí),先計(jì)算出該鍵的哈希值,然后根據(jù)哈希值找到對(duì)應(yīng)的哈希桶,

再在該哈希桶對(duì)應(yīng)的鏈表中查找或插入鍵值對(duì)。

  • 哈希桶的大小通常是一個(gè)質(zhì)數(shù),這是為了保證哈希函數(shù)的均勻性和哈希表的性能。
  • 如果哈希桶的大小比較小,會(huì)導(dǎo)致哈希沖突(hash collision)的概率增大,從而降低哈希表的性能;
  • 如果哈希桶的大小比較大,會(huì)浪費(fèi)內(nèi)存空間。

在Python中,哈希桶的大小是動(dòng)態(tài)調(diào)整的,當(dāng)哈希表中元素?cái)?shù)量達(dá)到一定閾值時(shí),Python會(huì)自動(dòng)擴(kuò)容哈希表,增加哈希桶的數(shù)量,在保證哈希函數(shù)均勻性和哈希表性能的同時(shí),提高哈希表的存儲(chǔ)容量。

總之,哈希桶是哈希表中存儲(chǔ)元素的容器,它是哈希表實(shí)現(xiàn)的關(guān)鍵之一,直接影響哈希表的性能和存儲(chǔ)容量。

setdefault方法的底層實(shí)現(xiàn)步驟:

  • 1、計(jì)算要查找或添加的鍵的哈希值,找到對(duì)應(yīng)的哈希桶。
  • 2、遍歷哈希桶對(duì)應(yīng)的鏈表,查找是否有鍵與要查找或添加的鍵相同。
  • 3、如果找到了相同的鍵,則返回該鍵對(duì)應(yīng)的值。
  • 4、如果沒(méi)有找到相同的鍵,則在鏈表頭部添加一個(gè)新的鍵值對(duì),并將鍵的值設(shè)置為默認(rèn)值。
  • 5、返回默認(rèn)值作為該鍵的值。?

底層實(shí)現(xiàn)的過(guò)程示例:

d = {"a": 1, "b": 2}

# 查找鍵'c'
if 'c' in d:
    value = d['c']
else:
    d['c'] = 3
    value = 3

# value = 3

# 修改鍵'a'的默認(rèn)值
if 'a' in d:
    value = d['a']
else:
    d['a'] = 3
    value = 3

# value = 1

手動(dòng)模擬了setdefault方法的實(shí)現(xiàn)過(guò)程。當(dāng)查找鍵'c'時(shí),因?yàn)樵撴I不存在,所以通過(guò)添加鍵值對(duì)的方式將鍵'c'的值設(shè)置為默認(rèn)值3。

當(dāng)查找鍵'a'時(shí),因?yàn)樵撴I已經(jīng)存在,所以返回鍵'a'對(duì)應(yīng)的值1,而不修改其默認(rèn)值。

總之,setdefault方法是Python字典的一個(gè)有用的方法,它可以方便地查找和添加鍵值對(duì)。

對(duì)于大型的數(shù)據(jù)處理應(yīng)用程序來(lái)說(shuō),使用哈希表來(lái)實(shí)現(xiàn)字典可以極大地提高程序的效率和性能。

4、setdefault 示例方法

4.1 添加一個(gè)新鍵和默認(rèn)值

d = {"a": 1, "b": 2}
d.setdefault("c", 3)
print(d)  # 輸出:{'a': 1, 'b': 2, 'c': 3}
# 字典d本來(lái)并沒(méi)有鍵為'c'的元素,使用setdefault方法可以添加一個(gè)新的鍵'c'和默認(rèn)值3

4.2 修改已有鍵的默認(rèn)值

d = {"a": 1, "b": 2}
d.setdefault("a", 3)
print(d)  # 輸出:{"a": 1, "b": 2}
# 字典d已經(jīng)有鍵'a',使用setdefault方法仍然會(huì)返回鍵'a'對(duì)應(yīng)的值1,而不會(huì)修改它的默認(rèn)值。

4.3 可以省略默認(rèn)值參數(shù)

d = {"a": 1, "b": 2}
d.setdefault("c")
print(d)  # 輸出:{"a": 1, "b": 2, "c": None}
# 省略了默認(rèn)值參數(shù),此時(shí)默認(rèn)值為None

4.4 在字典中嵌套一個(gè)列表

d = {}
d.setdefault("list", []).append(1)
d.setdefault("list", []).append(2)
print(d)  # 輸出:{"list": [1, 2]}
# 使用setdefault方法為字典d添加一個(gè)鍵'list',并將其值設(shè)置為一個(gè)空列表。然后,使用列表的append方法向該列表中添加元素1和2。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python查看FTP是否能連接成功的方法

    python查看FTP是否能連接成功的方法

    這篇文章主要介紹了python查看FTP是否能連接成功的方法,實(shí)例分析了Python連接FTP的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • python中的循環(huán)結(jié)構(gòu)問(wèn)題

    python中的循環(huán)結(jié)構(gòu)問(wèn)題

    這篇文章主要介紹了python中的循環(huán)結(jié)構(gòu)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Pandas+Numpy+Sklearn隨機(jī)取數(shù)的實(shí)現(xiàn)示例

    Pandas+Numpy+Sklearn隨機(jī)取數(shù)的實(shí)現(xiàn)示例

    使用Python、pandas、numpy、scikit-learn來(lái)實(shí)現(xiàn)隨機(jī)打亂、抽取和切割數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Python 的lru_cache裝飾器使用簡(jiǎn)介

    Python 的lru_cache裝飾器使用簡(jiǎn)介

    這篇文章主要介紹了Python 的lru_cache 裝飾器使用簡(jiǎn)介,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python中7刪除文件的7種方法實(shí)現(xiàn)與對(duì)比

    Python中7刪除文件的7種方法實(shí)現(xiàn)與對(duì)比

    本文提供了有關(guān)如何使用各種模塊和方法在Python中刪除文件的詳盡教程,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-09-09
  • python時(shí)間日期操作方法實(shí)例小結(jié)

    python時(shí)間日期操作方法實(shí)例小結(jié)

    這篇文章主要介紹了python時(shí)間日期操作方法,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)日期時(shí)間的轉(zhuǎn)換、計(jì)算相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • 基于Python采集爬取微信公眾號(hào)歷史數(shù)據(jù)

    基于Python采集爬取微信公眾號(hào)歷史數(shù)據(jù)

    這篇文章主要介紹了基于Python采集爬取微信公眾號(hào)歷史數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Django2.2配置xadmin的實(shí)現(xiàn)

    Django2.2配置xadmin的實(shí)現(xiàn)

    這篇文章主要介紹了Django2.2配置xadmin的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 一篇文章帶你深入理解Python中的object()

    一篇文章帶你深入理解Python中的object()

    這篇文章主要介紹了Python中object()的相關(guān)資料,object()是Python的內(nèi)置函數(shù),用于創(chuàng)建最基礎(chǔ)的對(duì)象實(shí)例,是所有類的基類,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Python報(bào)錯(cuò)AssertionError:can only test a child proc問(wèn)題

    Python報(bào)錯(cuò)AssertionError:can only test a c

    這篇文章主要介紹了Python報(bào)錯(cuò)AssertionError:can only test a child proc問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論

永春县| 马山县| 乌拉特中旗| 逊克县| 南汇区| 寻甸| 肃北| 南汇区| 丰都县| 沿河| 乌审旗| 河南省| 高雄县| 卓尼县| 梁山县| 双桥区| 汪清县| 鲜城| 乐平市| 信阳市| 韩城市| 达州市| 鄱阳县| 遵化市| 镇巴县| 兴国县| 武冈市| 临清市| 宜丰县| 砚山县| 本溪市| 临桂县| 渑池县| 那坡县| 祁门县| 六枝特区| 金川县| 深泽县| 莆田市| 清苑县| 张家界市|