標籤:

黃哥Python:Python 參數默認參數之值只計算一次

黃哥Python:Python 參數默認參數之值只計算一次

來自專欄通過python學會編程

有網友問

>>> def foo(bar=[]):

... bar.append("baz")

... return bar

>>> foo()

["baz"]

>>> foo()

["baz", "baz"]

>>> foo()

["baz", "baz", "baz"]

為什麼多次調用foo()bar的值不會重新賦值為[]呢?bar的作用域不是應該在foo函數之內嗎?

文檔中是這麼說的。

Important warning: The default value is evaluated only once. This makes a difference when the default is a mutable object such as a list, dictionary, or instances of most classes. For example, the following function accumulates the arguments passed to it on subsequent calls:

重要警告:默認值只計算一次。當默認值是可變對象(如列表,字典或大多數類的實例)時,這會有所不同。例如,以下函數會累積在後續調用中傳遞給它的參數

例子一:

i = 5def f(arg=i): print(arg)i = 6f()

輸出值為5,不是6

例子二:

def f(a, L=[]): L.append(a) return Lprint(f(1))print(f(2))print(f(3))

輸出值為

[1]

[1, 2]

[1, 2, 3]

這個原因是由於默認參數只計算一次,因為list 是可變數據類型,函數每次調用時,L 是同一個對象的引用。

加一個id(),可以判斷每次函數的調用都是訪問的同一個list 實例對象。

def f(a, L=[]): L.append(a) print(id(L)) return Lprint(f(1))print(f(2))print(f(3))

怎麼破解這個問題,這樣去修改代碼。

def f(a, L=None): if L is None: L = [] L.append(a) return L

黃哥談轉行當程序員

黃哥談轉行當程序員_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili?

www.bilibili.com圖標

黃哥談轉行當程序員之二

黃哥談轉行當程序員之二_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili?

www.bilibili.com圖標

黃哥Python提醒:轉行當程序員修鍊之路

黃哥:黃哥Python提醒:轉行當程序員修鍊之路?

zhuanlan.zhihu.com圖標

請看看我寫的文章

黃哥:黃哥寫的對Python初學者有價值的文章。?

zhuanlan.zhihu.com圖標
推薦閱讀:

廣義積分sinx/x的幾種解法
二次方程, 3次方程, 4次方程的解法
關於GTM⑨的抄書日記-11
從數學展開談一年的四分點,結合卦氣特徵來說明卦象數理模型
柯潔痛失世界第一,這是怎麼一回事兒?

TAG:數學 |