python 默認參數使用的注意事項

請先看下面的代碼

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或者不可變類型的參數來佔位就不會出現上次與期望結果不符的輸出了.


本文到此結束,謝謝大家能耐心的將它讀完,如有不足之處還請不吝賜教.

發佈了44 篇原創文章 · 獲贊 107 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章