python函數默認參數做用域

當def函數參數默認值爲對象時,例如列表[],字典{}python

 

示例1:猜想一下,會輸出什麼???  app

def ddd(a,b=[]): b.append(a)
    return b print(ddd(1)) print(ddd(2,['a','b','c'])) print(ddd(3))

 

[1]  ['a','b','c','2'] [3]   ?????你是否定爲是這樣? 輸出一下看看函數

輸出結果:spa

D:\Python27\python.exe D:/untitled1/temp5.py [1] ['a', 'b', 'c', 2] [1, 3]

 

看到以上結果有什麼想法,爲何呢???[1, 3]而不是[3],那麼修改一下代碼,輸出b變量的內存地址看一下。我想,能夠找到我要的答案code

def ddd(a,b=[]): b.append(a) print(id(b)) #查看內存地址
    return b print(ddd(1)) print(ddd(2,['a','b','c'])) print(ddd(3))

輸出結果:對象

D:\Python27\python.exe D:/untitled1/temp5.py 170580872 [1] 171586568 ['a', 'b', 'c', 2] 170580872 [1, 3]

從輸出中,能夠看出,除了,第二個print,其它兩個內存是一們的。那麼考慮一下爲何第二個爲被改變。結果顯而易見,由於第二個print改變了,b對象,從新建立了一個對象。blog

 

那麼若是不想出現,每次調用,默認值對象不變的問題,能夠這樣改一下:內存

def ddd(a,b=None): if type(b).__name__!='list': b = [] b.append(a) print(id(b)) #查看內存地址
    return b print(ddd(1)) print(ddd(2,['a','b','c'])) print(ddd(3))

初始值設置爲None,經過類型判斷來,進行內處理it

 

小結:class

       1.python定義def的時候,若是參數作爲對象,那麼,若是沒有改變這個對象的前提下,那麼即便,屢次調用該函數也,不會建立新的對象。

          那麼就會出現屢次調用函數,有可能都進行了處理。

  2.若是,沒有特殊需求,函數參數,儘可能不採用對象,若是一有須要,對象進行內處理。傳默認值None

相關文章
相關標籤/搜索