亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python函數問題

python函數問題

wolvvi 2017-01-15 14:35:22
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__屬性存儲著其在定義的時候聲明的默認參數

http://img1.sycdn.imooc.com//587b7d800001ab6002990409.jpg

這個__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)


查看完整回答
反對 回復 2017-01-15
  • wolvvi
    wolvvi
    那就您最后給出的這段代碼來說,如果調用這段代碼: append() append([1]) append() 會輸出[0],[1,0],[0] 第三個調用沒有傳遞參數,那么使用的應該是之前默認參數值為[0]的list吧,這樣傳進去的args不是none啊,那么if 語句為啥執行呢,得出的結果不還是應該為[0,0]嗎,為什么只有一個0呢列表中
  • Iamxiaoq
    Iamxiaoq
    def append(args=None): if args is None: args = [] # 這里只是對args這個局部變量進行賦值,并沒有改變__defaults__中的值,__defaults__中的值仍然為None args.append(0) print(args)
  • Iamxiaoq
    Iamxiaoq
    if args is None: args = [] # 這里只是對args這個局部變量進行賦值,并沒有改變__defaults__中的值,__defaults__中的值仍然為None
?
孤獨的小豬

TA貢獻232條經驗 獲得超302個贊

?[1]相當于是傳一個新的列表進去,并沒有用到函數中的?[] ?,?所以x.append(0)?在這次中,是追加到?[1]?里面,并不是函數默認的[]里面,你要用這種的話,就不能傳一個列表進去.

def?appendx(n,?x=[]):
????x.append(n)




查看完整回答
反對 回復 2017-01-16
  • 2 回答
  • 0 關注
  • 1888 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號