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>>這本書,寫的很好