2 回答

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

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