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

看板Python作者 (速球勝負 + 45度角絕殺)時間4年前 (2019/09/09 22:06), 編輯推噓4(407)
留言11則, 8人參與, 4年前最新討論串1/1
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=[]寫在括號外... 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.160.214.170 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1568037973.A.A16.html

09/09 22:16, 4年前 , 1F
define只會執行一次 而呼叫則是內部每次都執行
09/09 22:16, 1F

09/10 00:46, 4年前 , 2F
第二種result是區域變數,函數結果就沒了
09/10 00:46, 2F

09/10 20:20, 4年前 , 3F
上面的推文只回答了後半部,之所以會延續前一次呼叫的結果
09/10 20:20, 3F

09/10 20:20, 4年前 , 4F
是因為,Python 只在定義函式的時候會對 default argument
09/10 20:20, 4F

09/10 20:20, 4年前 , 5F
進行一次賦值,加上 list 是 mutable 才會造成那樣的結果
09/10 20:20, 5F

09/10 20:28, 4年前 , 6F
樓上正解
09/10 20:28, 6F

09/10 22:25, 4年前 , 7F
題外話不建議第一種default
09/10 22:25, 7F

09/10 22:26, 4年前 , 8F
用none會比較好喔
09/10 22:26, 8F

09/11 17:52, 4年前 , 9F
3樓正解,這個問題的名字叫mutable default argument
09/11 17:52, 9F

09/12 00:48, 4年前 , 10F
print(buggy.__defaults__) 你會發現新大陸
09/12 00:48, 10F

09/13 12:55, 4年前 , 11F
感謝各位!!
09/13 12:55, 11F
文章代碼(AID): #1TTbnLeM (Python)