最近有小伙伴在面試中遇到了“關于函數默認參數的坑”的題目,少數伙伴對此問題理得不是太清楚,今天匯智妹請到匯智動力高級教師鄧老師為大家詳細講解一下,幫助不太清楚的小伙伴清晰的梳理一遍。鄧老師本次主要從以下三點來講解:

  • 什么是默認參數?
  • 函數默認參數的坑是什么?
  • 函數默認參數為什么會有坑?

一、什么是默認參數

python為了簡化函數的調用,提供了默認參數機制,舉個例:

 

這樣在調用函數時,就可以不寫省略的參數。

在定義有默認參數的函數時,需要注意以下兩個方面:

 

1.必選參數必須在前面,默認參數在后;

2.設置何種參數為默認參數?一般來說,將參數值變化小的設置為默認參數。

 

二、函數默認參數的坑是什么?

當默認參數使用List時就是個坑,引用一個例子如下:

預期返回的結果應該是:

[0,1]

[0,1,2]

 

然而實際結果是:

 

三、函數默認參數為什么會有坑?

 

要弄清函數默認參數為什么會有坑,需要知道參數可變與不可變的區別。當默認參數指向可變類型對象和不可變類型對象時,會表現出不同的行為。

可變默認參數的表現同上個示例,不可變默認參數的變化情況,看以下示例:

 

輸出的結果是:

 

由此結果可以看出,第二次調用時默認參數b不會受第一次調用的影響,因為在函數里面進行計算后,b實際是指向了另外一個對象。而函數使用默認參數時,b指向的還是定義函數時,為b分配的內存地址,這個地址的值是沒有改變的。

也就是說,在定義函數默認參數時,解釋器會為其參數分配一個地址,且不管是第幾次調用,默認值的地址都不會改變,當b的默認值為列表時,b的id就已經定了,后面再用到此默認值,就會使用改變后的結果。