請先看下面的代碼
import time
def fun(t = time.time()):
print(t)
fun()
fun()
以下是輸出結果
1525179319.4658368
1525179319.4658368
我們所期望的是當我們多次掉用fun()
的時候能夠打印出不同的時間,可是實際的情況卻是每次所打印的值都是一樣的.
在看下面的例子
def appendtest(newitem, lista = []):
lista.append(newitem)
return lista
print(appendtest('a'))
print(appendtest('abc'))
以下是輸出結果
['a']
['a', 'abc']
結果並不是我們所期望的結果應該是['a']
和['abc']
,就上面兩種情況,我們來分析一下原因.
def 在python中是一個可執行的語句,當解釋器執行def的時候,默認參數也會被計算並存在函數的.func_defaults屬性中,由於python中函數參數傳遞的是對象,可變對象在調用者和被調用者之間是共享的,因此當首次調用appendtest()
的時候列表lista
的值變爲[“a”],而在此調用的時候由於默認參數不會重新計算,所以在原先的列表上面又追加了一個['abc']
元素,此時列表lista
就變成了['a', 'abc']
,關於第一個例子的原因和上面所說的是一樣的.
上面兩個例子的改正方法:
import time
def fun(t=time.time):
print(t())
def fun_1(a, lists=None):
if lists is None:
lists = list()
print(lists.append(a))
在這裏推薦大家定義默認參數時,使用None
或者不可變類型的參數來佔位就不會出現上次與期望結果不符的輸出了.
本文到此結束,謝謝大家能耐心的將它讀完,如有不足之處還請不吝賜教.