最近有小伙伴在面試中遇到了“關(guān)于函數(shù)默認(rèn)參數(shù)的坑”的題目,少數(shù)伙伴對(duì)此問(wèn)題理得不是太清楚,今天匯智妹請(qǐng)到匯智動(dòng)力高級(jí)教師鄧?yán)蠋煘榇蠹以敿?xì)講解一下,幫助不太清楚的小伙伴清晰的梳理一遍。鄧?yán)蠋煴敬沃饕獜囊韵氯c(diǎn)來(lái)講解:

  • 什么是默認(rèn)參數(shù)?
  • 函數(shù)默認(rèn)參數(shù)的坑是什么?
  • 函數(shù)默認(rèn)參數(shù)為什么會(huì)有坑?

一、什么是默認(rèn)參數(shù)

python為了簡(jiǎn)化函數(shù)的調(diào)用,提供了默認(rèn)參數(shù)機(jī)制,舉個(gè)例:

 

這樣在調(diào)用函數(shù)時(shí),就可以不寫(xiě)省略的參數(shù)。

在定義有默認(rèn)參數(shù)的函數(shù)時(shí),需要注意以下兩個(gè)方面:

 

1.必選參數(shù)必須在前面,默認(rèn)參數(shù)在后;

2.設(shè)置何種參數(shù)為默認(rèn)參數(shù)?一般來(lái)說(shuō),將參數(shù)值變化小的設(shè)置為默認(rèn)參數(shù)。

 

二、函數(shù)默認(rèn)參數(shù)的坑是什么?

當(dāng)默認(rèn)參數(shù)使用List時(shí)就是個(gè)坑,引用一個(gè)例子如下:

預(yù)期返回的結(jié)果應(yīng)該是:

[0,1]

[0,1,2]

 

然而實(shí)際結(jié)果是:

 

三、函數(shù)默認(rèn)參數(shù)為什么會(huì)有坑?

 

要弄清函數(shù)默認(rèn)參數(shù)為什么會(huì)有坑,需要知道參數(shù)可變與不可變的區(qū)別。當(dāng)默認(rèn)參數(shù)指向可變類(lèi)型對(duì)象和不可變類(lèi)型對(duì)象時(shí),會(huì)表現(xiàn)出不同的行為。

可變默認(rèn)參數(shù)的表現(xiàn)同上個(gè)示例,不可變默認(rèn)參數(shù)的變化情況,看以下示例:

 

輸出的結(jié)果是:

 

由此結(jié)果可以看出,第二次調(diào)用時(shí)默認(rèn)參數(shù)b不會(huì)受第一次調(diào)用的影響,因?yàn)樵诤瘮?shù)里面進(jìn)行計(jì)算后,b實(shí)際是指向了另外一個(gè)對(duì)象。而函數(shù)使用默認(rèn)參數(shù)時(shí),b指向的還是定義函數(shù)時(shí),為b分配的內(nèi)存地址,這個(gè)地址的值是沒(méi)有改變的。

也就是說(shuō),在定義函數(shù)默認(rèn)參數(shù)時(shí),解釋器會(huì)為其參數(shù)分配一個(gè)地址,且不管是第幾次調(diào)用,默認(rèn)值的地址都不會(huì)改變,當(dāng)b的默認(rèn)值為列表時(shí),b的id就已經(jīng)定了,后面再用到此默認(rèn)值,就會(huì)使用改變后的結(jié)果。