Python 函數(shù)參數(shù)作為引用時(shí)

Python唯一支持的參數(shù)傳遞模式是 共享傳參, 即函數(shù)的各個(gè)參數(shù)獲得實(shí)參中的各個(gè)引用的副本,也就是說,函數(shù)內(nèi)部的形參是實(shí)參的別名。

函數(shù)可能修改接收的對象

從程序中可以看出對于不變類型的int或元組,變量沒有改變,而作為可變類型的列表,變量發(fā)生了變化。
而很多時(shí)候我們不不想修改外部的數(shù)據(jù),只想對傳進(jìn)來的數(shù)據(jù)進(jìn)行修改。那么使用可變類型進(jìn)行傳參時(shí)也可能對外部數(shù)據(jù)進(jìn)行修改,達(dá)不到預(yù)期的結(jié)果。下面是一個(gè)很難發(fā)現(xiàn)的問題。
不要使用可變類型作為參數(shù)的默認(rèn)值

運(yùn)行結(jié)果

從上面的程序和運(yùn)行結(jié)果可知,bask1的運(yùn)行結(jié)果正常,bask2沒有傳遞參數(shù),就賦值為默認(rèn)的空列表,結(jié)果正常,而bask3一開始也是空的,應(yīng)該是輸出空列表,但結(jié)果不是,并且改變bask3的內(nèi)容時(shí),bask2的內(nèi)容也發(fā)生了變化,問題在于bask2.teams和bask3.teams都指向了同一列表。出現(xiàn)這種情況的原因是因?yàn)閟elf.teams變成了teams參數(shù)默認(rèn)值的別名,默認(rèn)值在定義函數(shù)時(shí)計(jì)算,因此默認(rèn)值也變成了函數(shù)對象的屬性。
可變默認(rèn)值導(dǎo)致的這個(gè)問題說明了為什么通常使用None作為接收可變值的參數(shù)的默認(rèn)值,解決方案可以是這樣
解決方案

運(yùn)行結(jié)果

從中可以看到bask2與bask3的結(jié)果不同,在引用外部數(shù)據(jù)時(shí)可加上list(),產(chǎn)生副本,對實(shí)例變量teams修改時(shí)就不會(huì)對basketball_team產(chǎn)生影響,如果不加list()函數(shù),那么basketball_team內(nèi)容也隨之發(fā)生變化

提示:內(nèi)容參考<<流暢的python>>這本書,寫的很好

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 〇、前言 本文共108張圖,流量黨請慎重! 歷時(shí)1個(gè)半月,我把自己學(xué)習(xí)Python基礎(chǔ)知識(shí)的框架詳細(xì)梳理了一遍。 ...
    Raxxie閱讀 19,591評論 17 410
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,686評論 1 51
  • 第5章 函數(shù)和函數(shù)式編程 5.1 引言函數(shù)是組織好的,可重復(fù)使用的,用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。函數(shù)...
    VIVAFT閱讀 1,090評論 0 5
  • 自制面膜
    4ae28c34b372閱讀 152評論 0 0
  • 女兒這周回來,又要求我天天美麗自己,還拿和我年紀(jì)差不多的女明星們和我比,讓我像她們那樣光鮮靚麗。這一次她和我提的是...
    千帆過盡z閱讀 341評論 0 1

友情鏈接更多精彩內(nèi)容