[问题] 初学者的函式问题

楼主: 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