1. 程式人生 > >《Python+Cookbook》筆記 方法中預設變數 可變導致的預設值更改

《Python+Cookbook》筆記 方法中預設變數 可變導致的預設值更改

《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]