《Python+Cookbook》筆記 方法中預設變數 可變導致的預設值更改
阿新 • • 發佈:2019-01-07
《Python+Cookbook》
第七章中在講解函式預設值時有以下一段話,覺得在實際應用中很有可能不小心犯錯而不知道.
預設引數的值應該是不可變的物件,比如 None、 True、 False、數字或字元
串。特別的,千萬不要像下面這樣寫程式碼:
def spam(a, b=[]): # NO!
如果你這麼做了,當預設值在其他地方被修改後你將會遇到各種麻煩。這些修改會
影響到下次呼叫這個函式時的預設值。
def spam(a, b=[]): print(b) return b x = spam(1) x.append(99) x.append('Yow!') print(x) spam(1)
執行結果
[]
[99, 'Yow!']
[99, 'Yow!']
[Finished in 0.2s]
返現最後執行 spam(1) 輸出內容是 b 的值 但此時輸出已是[99, 'Yow!'] 說明b的預設值已經改變
修改方法如下
def spam(a, b=None):
if b is None:
b = []
print(b)
return b
x = spam(1)
x.append(99)
x.append('Yow!')
print(x)
spam(1)
輸出內容
[]
[99, 'Yow!']
[]
[Finished in 0.2s]
判斷是不要直接
if not b :
b = []
這麼寫的問題在於儘管 None 值確實是被當成 False,但是還有其他的物件 (比如
長度為 0 的字串、列表、元組、字典等) 都會被當做 False (這點和java 中有區別,剛學python要注意)
另外需要注意的是函式預設引數是變數時,函式的預設值是不會和變數而一同改變的,預設值只會在第一次載入的時候賦予
u=100 def add(x:int, y= u) : return x + y print(add(1)) u=10 print(u) print(add(1))
輸出結果 :
101
10
101
[Finished in 0.1s]