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

這樣在調用函數時,就可以不寫省略的參數。
在定義有默認參數的函數時,需要注意以下兩個方面:
1.必選參數必須在前面,默認參數在后;
2.設置何種參數為默認參數?一般來說,將參數值變化小的設置為默認參數。
二、函數默認參數的坑是什么?
當默認參數使用List時就是個坑,引用一個例子如下:

預期返回的結果應該是:
[0,1]
[0,1,2]
然而實際結果是:

三、函數默認參數為什么會有坑?
要弄清函數默認參數為什么會有坑,需要知道參數可變與不可變的區別。當默認參數指向可變類型對象和不可變類型對象時,會表現出不同的行為。
可變默認參數的表現同上個示例,不可變默認參數的變化情況,看以下示例:

輸出的結果是:

由此結果可以看出,第二次調用時默認參數b不會受第一次調用的影響,因為在函數里面進行計算后,b實際是指向了另外一個對象。而函數使用默認參數時,b指向的還是定義函數時,為b分配的內存地址,這個地址的值是沒有改變的。
也就是說,在定義函數默認參數時,解釋器會為其參數分配一個地址,且不管是第幾次調用,默認值的地址都不會改變,當b的默認值為列表時,b的id就已經定了,后面再用到此默認值,就會使用改變后的結果。

