python中,有默認參數時,需要將默認參數放在必選參數之后
有多個默認參數時,可以通過順序提供默認參數,也可以不通過默認順序而是指定參數名提供參數。默認參數很有用,但有的時候也會變成坑。例如如下情況:
圖1 可變默認參數函數調用
原因解釋如下:
Python函數在定義的時候,默認參數L的值就被計算出來了,即[],因為默認參數L也是一個變量,它指向對象[],每次調用該函數,如果改變了L的內容,則下次調用時,默認參數的內容就變了,不再是函數定義時的[]了。
所以,定義默認參數要牢記一點:默認參數必須指向不變對象!
上述函數可修改成如下方式:
圖2 默認參數調用
為什么要設計str、None這樣的不變對象?因為不變對象一旦創建,對象內部的數據就不能修改,這樣就減少了由于修改數據導致的錯誤。此外,由于對象不變,多任務環境下同時讀取對象不需要加鎖,同時讀一點問題都沒有。我們在編寫程序時,如果可以設計一個不變對象,那就盡量設計成不變對象。