2020-09-26

探秘Python里的函數(shù)參數(shù)傳遞方式

原創(chuàng)?xinxin?菜鳥學(xué)Python?

閱讀本文大概需要6分鐘

經(jīng)常用python函數(shù)的同學(xué)們可能會(huì)有一個(gè)疑問窥翩,Python的函數(shù)的入?yún)⒌降资莻髦的剡€是引用,其實(shí)說實(shí)話褂痰,這個(gè)問題在我剛開始學(xué)python的時(shí)候也糾結(jié)過势就,因?yàn)閷?duì)于 c/c++,里面函數(shù)參數(shù)傳遞是有傳地址也有傳值的辫红。所以在python里面到底又是怎么樣.

其實(shí)這個(gè)問題很有意思怕轿,把這個(gè)問題弄明白之后肄满,對(duì)python的理解又前進(jìn)了一步.

開始之前我們先說一下什么是傳值,什么是傳引用

傳值

簡(jiǎn)單來說智政,你在內(nèi)存中有一個(gè)地址认罩,我也有一個(gè)地址,我呢把我的地址里面的內(nèi)容復(fù)制給你续捂,以后你做什么就跟我沒有啥關(guān)系垦垂,咱倆井水不犯河水。不會(huì)改變?cè)瓉淼膮?shù)的內(nèi)容

傳引用

所謂傳引用是有一個(gè)參數(shù)在內(nèi)存有個(gè)地址牙瓢,地址里面放了一堆東西,在調(diào)用函數(shù)時(shí)劫拗,把實(shí)際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改矾克,將影響到實(shí)際參數(shù)页慷。也就是說最后函數(shù)運(yùn)行完之后會(huì)改變?cè)瓉淼膮?shù)的內(nèi)容.

好下面我們來說一說Python里面是怎么做的,希望能給初學(xué)者一些啟示:

1.先看一個(gè)簡(jiǎn)單的例子

例1:傳引用

如果是傳引用胁附,也就是說最后會(huì)改變?cè)瓉淼膮?shù)酒繁,那么n的值在函數(shù)內(nèi)修改了變成了11,那么n最后應(yīng)該是11啊控妻,但是n還是10州袒,沒有變化,看來python不是傳引用弓候,那哎哎哎郎哭,是不是傳值呢,好我們接著往下探.

2.再看一個(gè)小例子

例2:傳值

若是傳值弓叛,old原來是['a','b','c']那么運(yùn)行完change()函數(shù)之后彰居,應(yīng)該還是['a','b','c'],顯然最后old的內(nèi)容改變了诚纸。

那么python中的參數(shù)傳遞也不是傳值撰筷,問題來了不是傳引用也不是傳值,到底是傳啥呢~~

3.深入探究

????????a=1,b=a,b=2

這個(gè)在C/C++里面執(zhí)行b=a的時(shí)候畦徘,其實(shí)是在內(nèi)存里面申請(qǐng)一塊內(nèi)存把a(bǔ)的值復(fù)制到內(nèi)存中毕籽,當(dāng)執(zhí)行b=2的時(shí)候,是把b對(duì)應(yīng)的值從1修改成2,如圖:

但是在Python里面的賦值并不是復(fù)制井辆,b=a的操作使得b與a引用同一個(gè)對(duì)象(注意是對(duì)象),而b=2則是b指向2关筒,如圖:

不信我們可以在程序里面驗(yàn)證:

a=1

print(id(a))

>>>33989408

b=a

print(id(b))?#b=a之后b的id()值和a一樣

>>>33989408

b=2

print(id(b))

>>>33989396?#b=2之后b指向?qū)ο?,id()值發(fā)生了改變

print(id(a))

>>>33989408

從程序里面寫可以看出

b=a賦值后b的id()和a一樣,b=2之后b指向了另外一塊空間杯缺,其實(shí)b=a傳遞的是對(duì)象的引用蒸播,它們指向同一塊內(nèi)存.

當(dāng)b=2之后b又重新指向了2所代表的對(duì)象上去,而此時(shí)1只有a指向.

4.揭開謎底

說了一大圈是時(shí)候揭開底牌了.對(duì)于例1,n=n+1袍榆,因?yàn)閚是數(shù)字,是不可變的對(duì)象胀屿,n+1會(huì)重新申請(qǐng)一塊新的內(nèi)存,其值為n+1,并在函數(shù)體中創(chuàng)建局部變量n指向它包雀。當(dāng)函數(shù)add()調(diào)用完之后宿崭,函數(shù)體中的局部變量在函數(shù)體外不可見,此時(shí)的n代表函數(shù)體外的命名空間所對(duì)應(yīng)的n才写,所以其值還是10.

結(jié)論:Python函數(shù)參數(shù)傳遞的是對(duì)象的引用,參數(shù)傳遞的過程中將整個(gè)對(duì)象傳入.

對(duì)于可變的對(duì)象的修改在函數(shù)外部和內(nèi)部都可見葡兑,調(diào)用者和被調(diào)用者共享這個(gè)對(duì)象

而對(duì)于不可變對(duì)象,由于并不能真正被修改赞草,因?yàn)樾薷囊话愣际峭ㄟ^生成一個(gè)新的對(duì)象然后賦值來實(shí)現(xiàn)的讹堤。

(好謎底揭開了,剛才我特意沒有解釋例2厨疙,現(xiàn)在你試著去理解看看蜕劝,是不是能明白.)

好了最后說一下,若我寫的對(duì)大家有幫助轰异,麻煩大家支持一下,也是對(duì)我的一點(diǎn)鼓勵(lì)和動(dòng)力.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岖沛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搭独,更是在濱河造成了極大的恐慌婴削,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牙肝,死亡現(xiàn)場(chǎng)離奇詭異唉俗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)配椭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門虫溜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人股缸,你說我怎么就攤上這事衡楞。” “怎么了敦姻?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵瘾境,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我镰惦,道長(zhǎng)迷守,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任旺入,我火速辦了婚禮兑凿,結(jié)果婚禮上凯力,老公的妹妹穿的比我還像新娘。我一直安慰自己礼华,他們只是感情好沮协,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卓嫂,像睡著了一般慷暂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晨雳,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天行瑞,我揣著相機(jī)與錄音,去河邊找鬼餐禁。 笑死血久,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帮非。 我是一名探鬼主播氧吐,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼末盔!你這毒婦竟也來了筑舅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤陨舱,失蹤者是張志新(化名)和其女友劉穎翠拣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體游盲,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡误墓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了益缎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谜慌。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖莺奔,靈堂內(nèi)的尸體忽然破棺而出欣范,到底是詐尸還是另有隱情,我是刑警寧澤弊仪,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布熙卡,位于F島的核電站,受9級(jí)特大地震影響励饵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滑燃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一役听、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦典予、人聲如沸甜滨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衣摩。三九已至,卻和暖如春捂敌,著一層夾襖步出監(jiān)牢的瞬間艾扮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工占婉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泡嘴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓逆济,卻偏偏與公主長(zhǎng)得像酌予,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奖慌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361