2 回答

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

TA貢獻(xiàn)232條經(jīng)驗 獲得超302個贊
?[1]相當(dāng)于是傳一個新的列表進(jìn)去,并沒有用到函數(shù)中的?[] ?,?所以x.append(0)?在這次中,是追加到?[1]?里面,并不是函數(shù)默認(rèn)的[]里面,你要用這種的話,就不能傳一個列表進(jìn)去.
def?appendx(n,?x=[]): ????x.append(n)
添加回答
舉報