Python 默認參數提升了變成效率,可是這裏面的坑也是坑死人不償命,使用稍微不正確,會形成致命的失誤java
#!/usr/bin/env python # -*- coding: utf-8 -*- def test(lang=[]): lang.append('python') return lang
當老實調用時,結果如你所願python
print(test(['js','go'])) print(test(['c','java']))
結果以下app
['js', 'go', 'python'] ['c', 'java', 'python'] [Finished in 0.1s]
可是若是屢次使用默認參數調用時,奇蹟出現了函數
print(test()) print(test())
結果以下:測試
['python'] ['python', 'python'] [Finished in 0.1s]
或許有人對此感到很困惑,爲何默認參數會記住更新過的默認參數code
分析:
函數在定義的時候,默認參數lang
的值就已經聲明瞭,即空的 []
,也就是說 默認參數
指向對象 []
,在屢次調用默認參數的狀況下,就改變了默認參數
指向對象的數據,默認參數
指向對象的數據變了,下次再調用時,默認參數已經變了,即再也不是你但願的空的[]
對象
爲了便於理解等同下面這段:utf-8
temp = [] def test(lang=temp): lang.append('python') return lang
這樣就好看多了,屢次調用時,temp
也在不斷的變化test
注意函數默認參數和函數中的參數的上下文環境效率
定義函數默認參數時,函數默認參數必須指向不變對象,建議使用 None,str 這些不可變對象處理
從新修改代碼
#!/usr/bin/env python # -*- coding: utf-8 -*- def test(lang=None): if lang is None: lang = [] lang.append('python') return lang
調用
print(test()) print(test())
結果:
['python'] ['python'] [Finished in 0.2s]