python函式的預設引數請勿定義可變型別

2021-09-26 11:00:46 字數 970 閱讀 1659

經常會看到這樣一句**警告:

default argument value is mutable

意思是告訴我們函式的定義中,使用可變型別做預設引數。

那為什麼會有這個警告呢?

可變型別(mutable):列表,字典

不可變型別(unmutable):數字,字串,元組

def

fun(a=

):1)

print

(a)if __name__ ==

"__main__"

: fun(

) fun(

)>>

>[1

][1,

1]

可以發現,預設引數定義可變型別之後,在第二次乃至更多次地呼叫同乙個函式時,預設引數彷彿失去了效果。

此時,在需要重複呼叫同乙個函式的場景中,就非常容易導致問題,並且該問題不易察覺。在debug的時候就會表現成明明沒有引數傳進來,但是函式引數會有值,並且執行了不應該執行的操作。

我的理解:

我們定義的函式本身是乙個function的例項化物件,每當我們進行函式的定義時,就是建立了乙個function的例項化物件,而預設引數就是其屬性。

在沒有傳入引數,以預設引數形式呼叫,並且改變了函式物件的屬性值時,改變的屬性值被儲存下來,當第二次呼叫同乙個物件時,屬性值已經發生了改變。

type(fun)

>>> function

def

fun(a=

none):

if a is

none

: a =

1)print

(a)if __name__ ==

"__main__"

: fun(

) fun(

)>>

>[1

][1]

Python 函式的引數 預設引數

預設引數很有用,但使用不當,也會掉坑里。預設引數有個最大的坑,演示如下 先定義乙個函式,傳入乙個list,新增乙個end再返回 def add end l return l當你正常呼叫時,結果似乎不錯 add end 1,2,3 1,2,3,end add end x y z x y z end 當...

python 預設引數 Python預設引數有坑?

最近有小夥伴在面試中遇到了 關於函式預設引數的坑 的題目,少數夥伴對此問題理得不是太清楚,今天匯智妹請到匯智動力高階教師鄧老師為大家詳細講解一下,幫助不太清楚的小夥伴清晰的梳理一遍。鄧老師本次主要從以下三點來講解 什麼是預設引數?函式預設引數的坑是什麼?函式預設引數為什麼會有坑?一 什麼是預設引數 ...

Python函式預設引數值

python的函式機制提供了可選引數的功能,可選引數需要放在引數列表的後幾個引數。當呼叫這些函式時,如果不想設定這些引數,就可以不用設定而直接使用函式定義的時候設定的引數預設值。同樣的,呼叫函式的時候也可以重新設定引數,這將覆蓋預設設定的引數。def func x,y 2 print x y fun...