def append(args=[]):????args.append(0)????print(args)append()append([1])append()會輸出[0][1,0][0,0]想問下為什么第三個會是[0,0]呢,再次調用args的時候還是第一次調用的args為啥呢
2 回答
已采納

Iamxiaoq
TA貢獻33條經驗 獲得超6個贊
在python里面,一切切對象,函數也是對象,函數這個對象有個特殊的__defaults__屬性存儲著其在定義的時候聲明的默認參數
這個__defaults__隨著函數的定義而生成,第27
如果調用時沒有傳遞參數,則使用存儲在__defaults__中的值,第28
由于第28調用了__defaults__中的list.append(0),調用完成后__defaults__中的list的值為[0],第29
第30append([1]),此次調用傳遞了值,則不使用默認參數,可以看到兩個id不一樣
第30調用完成后也不影響__defaults__中的list,第31
第32的調用也沒有傳遞參數,則使用__defaults__中保存的list,經過第28后,默認參數list的值為:[0],此時再執行[0].append(0),得到的自然是[0,0], 輸出的id與28輸出的id一致,證明他們是同一個list。。。。
所以,默認參數一般不要使用可變對象
def?append(args=None): ????if?args?is?None: ????????args?=?[] ????args.append(0) ????print(args)

孤獨的小豬
TA貢獻232條經驗 獲得超302個贊
?[1]相當于是傳一個新的列表進去,并沒有用到函數中的?[] ?,?所以x.append(0)?在這次中,是追加到?[1]?里面,并不是函數默認的[]里面,你要用這種的話,就不能傳一個列表進去.
def?appendx(n,?x=[]): ????x.append(n)
添加回答
舉報
0/150
提交
取消