默認引數的坑
定義一個函式,傳入一個list,添加一個end再回傳
def add_end(L=[]):
L.append('END')
return L
正常呼叫時,結果似乎不錯
print (add_end([1,2,3])) #[1, 2, 3, 'END']
使用默認引數呼叫時,一開始結果也是對的,但是再次呼叫時,結果就不對了
'''
學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
print (add_end()) #['END']
print (add_end()) #['END', 'END']
print (add_end()) #['END', 'END', 'END']
從上述呼叫結果發現,函式每次都記住了上次添加了‘END’后的list,python函式在定義的時候,默認引數L的值就被計算出來了即[],因為默認引數L也是一個變數,它指向物件[],每次呼叫該函式,如果改變 了L的內容,則下次呼叫時,默認引數的內容就變了,不再是函式定義時的[]了
所以,定義默認引數要牢記一點:默認引數必須指向不變物件
修改上面的例子,可以用None這個不變物件來實作
def add_end2(L=None):
if L is None:
L=[]
L.append('END')
return L
無論呼叫多少次都沒問題
print (add_end2())
print (add_end2())
print (add_end2())
#['END']
#['END']
#['END']
不變物件一旦創建,物件內部的資料就不能修改,這樣就減少了由于修改資料導致的錯誤,此外,由于物件不變,多任務環境下同時讀取物件不需要加鎖,同時讀一點問題都沒有,我們在撰寫程式時,如果可以設計一個不變物件,那就盡量設計成不變物件,
不可變(immutable):int、字串(string)、float、(數值型number)、元組(tuple)
可變(mutable):字典型(dictionary)、串列型(list)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/499318.html
標籤:Python
上一篇:Python + Vue Electron 構建桌面應用
下一篇:Python基礎day23:絕對匯入和相對匯入、模塊化編程簡介、軟體開發目錄規范、常見內置模塊collections和time
