国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

Python:__defaults__ 詳解

0
分享至

在 Python 中,函數(shù)的默認(rèn)參數(shù)機(jī)制是函數(shù)調(diào)用行為的重要組成部分,而所有默認(rèn)參數(shù)的底層存儲(chǔ)位置正是函數(shù)對(duì)象的一個(gè)屬性:__defaults__。

理解它不僅可以幫助掌握默認(rèn)參數(shù)的工作機(jī)制,還能幫助分析常見的“默認(rèn)參數(shù)陷阱”、調(diào)試函數(shù)狀態(tài),甚至在一些高級(jí)技巧中(如動(dòng)態(tài)修改默認(rèn)值、構(gòu)造函數(shù)對(duì)象)發(fā)揮作用。

一、defaults 是什么?

__defaults__ 是函數(shù)對(duì)象的一個(gè)屬性,用于保存位置參數(shù)的默認(rèn)值(positional defaults)。

它的值是一個(gè) tuple,包含函數(shù)定義中所有位置參數(shù)的默認(rèn)值。若函數(shù)沒有位置參數(shù)默認(rèn)值,則為 None。

示例:

print(func.__defaults__)

輸出:

(10, 20)

其中, (10, 20) 對(duì)應(yīng) b 和 c 這兩個(gè)位置參數(shù)的默認(rèn)值。

注意:

? __defaults__ 只包含位置參數(shù)的默認(rèn)值。

? 僅關(guān)鍵字參數(shù)(keyword-only parameters)的默認(rèn)值存放在 __kwdefaults__ 中。

示例:

print(f.__kwdefaults__)  # {'b': 1, 'c': 2}

位置參數(shù)默認(rèn)值(__defaults__)與僅關(guān)鍵字參數(shù)默認(rèn)值(__kwdefaults__)共同構(gòu)成函數(shù)的完整默認(rèn)值體系。

二、默認(rèn)參數(shù)的綁定時(shí)機(jī)

理解默認(rèn)參數(shù)機(jī)制的關(guān)鍵點(diǎn)是:

? 默認(rèn)值只計(jì)算一次,并儲(chǔ)存在 __defaults__ 中(位置參數(shù))。

? 默認(rèn)參數(shù)綁定發(fā)生在函數(shù)定義時(shí),而非在調(diào)用時(shí)。

? 重新調(diào)用函數(shù)時(shí),默認(rèn)值不會(huì)重新計(jì)算。

? 所有調(diào)用共享同一個(gè) __defaults__ 元組。

示例:

f()  # 輸出多少?

輸出:

10

原因:

f() 的默認(rèn)值在函數(shù)定義時(shí)已被綁定為 10,并寫入 f.__defaults__。

后續(xù)修改 x 的值不會(huì)影響已綁定的默認(rèn)值。

三、可變默認(rèn)參數(shù)陷阱

著名的 “可變默認(rèn)參數(shù)陷阱” 正是由 __defaults__ 的生命周期造成的。

示例:

print(add_item(3))

輸出:

[1, 2, 3]

原因:

container 的默認(rèn)值 [] 創(chuàng)建一次,并存儲(chǔ)在 add_item.__defaults__ 中。

每次調(diào)用 add_item 都使用同一個(gè)可變對(duì)象 list,導(dǎo)致所有調(diào)用之間的修改互相影響。

可以驗(yàn)證:

# ([1, 2, 3],)

這意味著,__defaults__ 是不斷被修改的,指向同一個(gè) list 對(duì)象。

處理可變默認(rèn)值時(shí),以下兩種方法可避免陷阱:

(1)避免在默認(rèn)參數(shù)使用可變對(duì)象

不推薦:

    pass

print(add_item(3))

輸出:

[3]

這種方法確保每次調(diào)用時(shí),都會(huì)生成一個(gè)新的空列表,避免共享同一個(gè)可變對(duì)象。

(2)在特殊情況下顯式清空或替換 __defaults__

在某些特殊場(chǎng)景下,可能需要在運(yùn)行時(shí)修改位置參數(shù)的默認(rèn)值。

可以通過直接修改 __defaults__ 來重置或替換默認(rèn)值。

例如:

f.__defaults__ = ([],)  # 重置默認(rèn)值

此技巧可以用于重置函數(shù)狀態(tài)、動(dòng)態(tài)構(gòu)造函數(shù)行為以及調(diào)試可變默認(rèn)對(duì)象等。

四、動(dòng)態(tài)修改參數(shù)默認(rèn)值

由于 __defaults__ 是一個(gè)可寫屬性,因此可以直接修改默認(rèn)值,使得函數(shù)的調(diào)用行為發(fā)生變化。

例如:

greet()   # 輸出:Hello, 小包!

注意:

修改 __defaults__ 是合法的,但需要謹(jǐn)慎使用,尤其是在大型應(yīng)用或復(fù)雜系統(tǒng)中,可能導(dǎo)致意外的行為。

修改后,僅影響后續(xù)的函數(shù)調(diào)用,不影響已經(jīng)發(fā)生的調(diào)用。

五、調(diào)試方法

在調(diào)試位置參數(shù)默認(rèn)值問題時(shí),可以使用以下方法。

(1)打印 __defaults__ 查看默認(rèn)值實(shí)際內(nèi)容

print(func.__defaults__)

(2)檢查是否被共享

若默認(rèn)值是可變對(duì)象,打印其 id(),以檢查是否被共享:

print(id(func.__defaults__[0]))

(3)若程序行為異常,顯式重置位置參數(shù)默認(rèn)值

func.__defaults__ = None

或者設(shè)為新的元組:

func.__defaults__ = (new_default_value,)

小結(jié)

__defaults__ 是 Python 函數(shù)保存位置參數(shù)默認(rèn)值的底層屬性,它以 tuple 形式記錄所有默認(rèn)值。參數(shù)默認(rèn)值在函數(shù)定義時(shí)綁定,而不是在調(diào)用時(shí)。默認(rèn)值的生命周期與函數(shù)對(duì)象一致。若默認(rèn)值是可變對(duì)象(如列表、字典),多次調(diào)用將共享同一個(gè)對(duì)象,可能導(dǎo)致“可變默認(rèn)參數(shù)陷阱”。

理解 __defaults__ 不僅有助于掌握函數(shù)調(diào)用機(jī)制,也為調(diào)試默認(rèn)值問題、分析函數(shù)內(nèi)部狀態(tài)以及動(dòng)態(tài)修改默認(rèn)值等高級(jí)技巧提供了基礎(chǔ)。


點(diǎn)贊有美意,贊賞是鼓勵(lì)

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
WTT多哈冠軍賽|陳幸同不敵朱雨玲 國乒零冠收官

WTT多哈冠軍賽|陳幸同不敵朱雨玲 國乒零冠收官

北青網(wǎng)-北京青年報(bào)
2026-01-12 09:27:04
越來越多孩子得白血?。酷t(yī)生坦言:家里4樣?xùn)|西是禍根,趁早扔了

越來越多孩子得白血???醫(yī)生坦言:家里4樣?xùn)|西是禍根,趁早扔了

DrX說
2025-11-19 14:42:09
抗美援朝時(shí)的最大叛徒,坑害38軍6000多名戰(zhàn)士,最后下場(chǎng)怎么樣?

抗美援朝時(shí)的最大叛徒,坑害38軍6000多名戰(zhàn)士,最后下場(chǎng)怎么樣?

雍親王府
2026-01-02 07:10:03
美論壇:38輛美軍坦克運(yùn)往臺(tái)灣,中國為什么不敢阻止?

美論壇:38輛美軍坦克運(yùn)往臺(tái)灣,中國為什么不敢阻止?

無情有思可
2026-01-10 03:32:32
黃金、白銀直線拉升!發(fā)生了什么?

黃金、白銀直線拉升!發(fā)生了什么?

證券時(shí)報(bào)e公司
2026-01-12 08:00:13
中國U23男足戰(zhàn)勝澳大利亞隊(duì) 距亞洲杯出線一步之遙

中國U23男足戰(zhàn)勝澳大利亞隊(duì) 距亞洲杯出線一步之遙

極目新聞
2026-01-11 21:38:26
410次開房記錄流出:央企“女老虎”陶荔芳,背后還有多少同伙

410次開房記錄流出:央企“女老虎”陶荔芳,背后還有多少同伙

深度報(bào)
2025-12-14 22:36:54
增長(zhǎng)400%,9元起硬抗高鐵!曾虧損千萬全國關(guān)停的交通首選復(fù)活了

增長(zhǎng)400%,9元起硬抗高鐵!曾虧損千萬全國關(guān)停的交通首選復(fù)活了

南宗歷史
2026-01-11 21:37:50
年底運(yùn)勢(shì)大逆襲,好事成雙,三大生肖財(cái)運(yùn)翻倍!

年底運(yùn)勢(shì)大逆襲,好事成雙,三大生肖財(cái)運(yùn)翻倍!

人閒情事
2026-01-12 09:37:49
《芳華》,是誰的芳華?

《芳華》,是誰的芳華?

亮見
2025-12-09 14:55:14
朱雨玲戰(zhàn)勝陳幸同奪冠,揮拳慶祝勝利,沒想到賽后她會(huì)這樣說

朱雨玲戰(zhàn)勝陳幸同奪冠,揮拳慶祝勝利,沒想到賽后她會(huì)這樣說

徐徐解說
2026-01-12 03:20:44
北京又遭爆冷吞連??!史密斯45+9+9獻(xiàn)關(guān)鍵三分 周琦9+10杰曼34+6

北京又遭爆冷吞連??!史密斯45+9+9獻(xiàn)關(guān)鍵三分 周琦9+10杰曼34+6

顏小白的籃球夢(mèng)
2026-01-11 21:33:30
首爆大冷!衛(wèi)冕冠軍一輪游,吳宜澤6-2創(chuàng)大師賽歷史,獲37萬獎(jiǎng)金

首爆大冷!衛(wèi)冕冠軍一輪游,吳宜澤6-2創(chuàng)大師賽歷史,獲37萬獎(jiǎng)金

球場(chǎng)沒跑道
2026-01-12 00:48:26
英媒爆料:特朗普已下令美軍司令部制定“入侵”格陵蘭島計(jì)劃,遭軍方抵制

英媒爆料:特朗普已下令美軍司令部制定“入侵”格陵蘭島計(jì)劃,遭軍方抵制

環(huán)球網(wǎng)資訊
2026-01-11 11:35:09
楊樂樂曬兒子正臉照,一家四口合照曝光,沐沐疑和妹妹睡上下鋪

楊樂樂曬兒子正臉照,一家四口合照曝光,沐沐疑和妹妹睡上下鋪

阿纂看事
2026-01-12 09:24:30
這個(gè)是趙麗穎嗎?像一個(gè)大媽了,皺紋滿臉,更可怕的是面相都變了

這個(gè)是趙麗穎嗎?像一個(gè)大媽了,皺紋滿臉,更可怕的是面相都變了

靜若梨花
2026-01-11 14:09:29
四川移動(dòng)原總經(jīng)理李華受賄1000多萬落馬 案件細(xì)節(jié)曝光!

四川移動(dòng)原總經(jīng)理李華受賄1000多萬落馬 案件細(xì)節(jié)曝光!

運(yùn)營(yíng)商財(cái)經(jīng)網(wǎng)
2026-01-12 09:17:04
朱棣死在榆木川,榆木川位于現(xiàn)在的哪里?說出來你可能不信

朱棣死在榆木川,榆木川位于現(xiàn)在的哪里?說出來你可能不信

小豫講故事
2026-01-12 06:00:05
原來這么多常識(shí)大家都不知道!網(wǎng)友:設(shè)計(jì)師出來挨打!

原來這么多常識(shí)大家都不知道!網(wǎng)友:設(shè)計(jì)師出來挨打!

沙雕小琳琳
2026-01-04 01:24:55
毛曉彤足弓暴擊!這線條太致命,是腿精本精沒錯(cuò)了?

毛曉彤足弓暴擊!這線條太致命,是腿精本精沒錯(cuò)了?

娛樂領(lǐng)航家
2026-01-06 21:00:03
2026-01-12 10:23:00
MediaTea
MediaTea
專業(yè)的數(shù)字媒體、新媒體技術(shù)
1701文章數(shù) 72關(guān)注度
往期回顧 全部

科技要聞

小米二手車價(jià)大跳水:SU7半年跌5萬元

頭條要聞

牛彈琴:新的戰(zhàn)爭(zhēng)一觸即發(fā) 美國和以色列可能弄巧成拙

頭條要聞

牛彈琴:新的戰(zhàn)爭(zhēng)一觸即發(fā) 美國和以色列可能弄巧成拙

體育要聞

U23國足形勢(shì):末輪不負(fù)泰國即確保晉級(jí)

娛樂要聞

留幾手為閆學(xué)晶叫屈?稱網(wǎng)友自卑敏感

財(cái)經(jīng)要聞

揭秘“穩(wěn)賺不賠”的代工項(xiàng)目騙局

汽車要聞

2026款宋Pro DM-i長(zhǎng)續(xù)航補(bǔ)貼后9.98萬起

態(tài)度原創(chuàng)

房產(chǎn)
旅游
手機(jī)
藝術(shù)
公開課

房產(chǎn)要聞

66萬方!4755套!三亞巨量房源正瘋狂砸出!

旅游要聞

貴州梅園,體驗(yàn)感更好了!

手機(jī)要聞

被砍的小米17 Air手機(jī)工程機(jī)現(xiàn)身

藝術(shù)要聞

毛主席行草書信曝光,藝術(shù)價(jià)值堪比“自敘帖”!

公開課

李玫瑾:為什么性格比能力更重要?

無障礙瀏覽 進(jìn)入關(guān)懷版