黃哥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黃哥談轉行當程序員之二
黃哥談轉行當程序員之二_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili黃哥Python提醒:轉行當程序員修鍊之路
黃哥:黃哥Python提醒:轉行當程序員修鍊之路請看看我寫的文章
黃哥:黃哥寫的對Python初學者有價值的文章。推薦閱讀:
※廣義積分sinx/x的幾種解法
※二次方程, 3次方程, 4次方程的解法
※關於GTM⑨的抄書日記-11
※從數學展開談一年的四分點,結合卦氣特徵來說明卦象數理模型
※柯潔痛失世界第一,這是怎麼一回事兒?
TAG:數學 |