[問題] 初學者的函式問題

作者: h888512 (速球勝負 + 45度角絕殺)   2019-09-09 22:06:08
Hi 各位先進好
小弟是初學者,請各位多多指教。小弟在看Lubanovic的Python教科書
有個地方不是很懂,如下:
def buggy(arg,result=[]):
result.append(arg)
print(result)
上述函式若呼叫兩次, 串列會繼承前一次呼叫的值,若第一次引數a,第二次b
則串列為['a','b']
但若為下述,則不會繼承前一次呼叫之值
def buggy(arg):
result = []
result.append(arg)
print(result)
小弟無法理解的是為何把result=[]寫在buggy括號內, 串列會繼承前次呼叫之值
雖然我自己寫會把result=[]寫在括號外...
感謝
作者: germun (ger)   2019-09-09 22:16:00
define只會執行一次 而呼叫則是內部每次都執行
作者: alvinlin (林矜業)   2019-09-10 00:46:00
第二種result是區域變數,函數結果就沒了
作者: Ryspon (Ry)   2019-09-10 20:20:00
上面的推文只回答了後半部,之所以會延續前一次呼叫的結果是因為,Python 只在定義函式的時候會對 default argument進行一次賦值,加上 list 是 mutable 才會造成那樣的結果
作者: TitanEric (泰坦)   2019-09-10 20:28:00
樓上正解
作者: somoskylin (八七booboo)   2019-09-10 22:25:00
題外話不建議第一種default用none會比較好喔
作者: aaron880221 (aaron)   2019-09-11 17:52:00
3樓正解,這個問題的名字叫mutable default argument
作者: s860134 (s860134)   2019-09-12 00:48:00
print(buggy.__defaults__) 你會發現新大陸
作者: h888512 (速球勝負 + 45度角絕殺)   2019-09-13 12:55:00
感謝各位!!

Links booklink

Contact Us: admin [ a t ] ucptt.com