新聞中心
Python中函數(shù)調(diào)用是傳值還是傳引用
python不允許程序員選擇采用傳值還是傳引用。Python參數(shù)傳遞采用的肯定是“傳對象引用”的方式。這種方式相當(dāng)于傳值和傳引用的一種綜合。如果函數(shù)收到的是一個(gè)可變對象(比如字典或者列表)的引用,就能修改對象的原始值--相當(dāng)于通過“傳引用”來傳遞對象。如果函數(shù)收到的是一個(gè)不可變對象(比如數(shù)字、字符或者元組)的引用,就不能直接修改原始對象--相當(dāng)于通過“傳值'來傳遞對象。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了甘井子免費(fèi)建站歡迎大家使用!
python中值傳遞還是引用傳遞?
首先,Python中一切事物皆對象,變量是對對象在內(nèi)存中的存儲和地址的抽象。所有的變量都可以理解是內(nèi)存中一個(gè)對象的“引用”,或者,也可以看似c中void*的感覺。
python中統(tǒng)一都是引用傳遞,同時(shí)要注意類型是屬于對象的,而不是變量。而對象有兩種,“可更改”(mutable)與“不可更改”(immutable)對象。在python中,strings, tuples, 和numbers是不可更改的對象,而list,dict等則是可以修改的對象。
當(dāng)我們寫下面語句時(shí):
Python解釋器其實(shí)順序干了兩件事情:
從這里可以看出strings類型是不可變量,不可變實(shí)際上指的是不會(huì)更該字符串,比如把a(bǔ) = '123' 變?yōu)?a ='1234' 實(shí)際上是先創(chuàng)建了 “1234” 再用a去指向它。
但是,像list,dict等“可更改”的變量,他們會(huì)直接再本地更改,不會(huì)進(jìn)行副本拷貝。
簡言之,當(dāng)在 Python 中 a = sth 應(yīng)該理解為給 sth 貼上了一個(gè)標(biāo)簽 a。當(dāng)再賦值給 a 的時(shí)候,就好象把 a 這個(gè)標(biāo)簽從原來的 sth 上拿下來,貼到其他對象上,建立新的"引用"。
既然Python只允許引用傳遞,那有沒有辦法可以讓兩個(gè)變量不再指向同一內(nèi)存地址呢?
copy對于一個(gè)復(fù)雜對象的子對象并不會(huì)完全復(fù)制,什么是復(fù)雜對象的子對象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是復(fù)雜對象的子對象。對于子對象,python會(huì)把它當(dāng)作一個(gè)公共鏡像存儲起來,所有對他的復(fù)制都被當(dāng)成一個(gè)引用,所以說當(dāng)其中一個(gè)引用將鏡像改變了之后另一個(gè)引用使用鏡像的時(shí)候鏡像已經(jīng)被改變了。
deepcopy的時(shí)候會(huì)將復(fù)雜對象的每一層復(fù)制一個(gè)單獨(dú)的個(gè)體出來。 當(dāng)然其中主要的操作還是地址問題。
當(dāng)一個(gè)引用傳遞給函數(shù)的時(shí)候,函數(shù)自動(dòng)復(fù)制一份引用,這個(gè)函數(shù)里的引用和外邊的引用沒有半毛關(guān)系了.所以第一個(gè)例子里函數(shù)把引用指向了一個(gè)不可變對象,當(dāng)函數(shù)返回的時(shí)候,外面的引用沒半毛感覺.而第二個(gè)例子就不一樣了,函數(shù)內(nèi)的引用指向的是可變對象,對它的操作就和定位了指針地址一樣,在內(nèi)存里進(jìn)行修改.
引用計(jì)數(shù)
PyObject是每個(gè)對象必有的內(nèi)容,其中ob_refcnt就是做為引用計(jì)數(shù)。當(dāng)一個(gè)對象有新的引用時(shí),它的ob_refcnt就會(huì)增加,當(dāng)引用它的對象被刪除,它的ob_refcnt就會(huì)減少.引用計(jì)數(shù)為0時(shí),該對象生命就結(jié)束了。
優(yōu)點(diǎn):
缺點(diǎn):
Python中后面引用前面的代碼怎么樣簡單
開頭用import函數(shù)
Python中后面引用前面的代碼,在開頭import函數(shù)。在程序里直接使用之前寫的函數(shù)代碼就可以了。
python中變量的引用、可變和不可變類型、局部變量和全局變量
變量的引用
變量和數(shù)據(jù)都是保存在內(nèi)存中的
變量和數(shù)據(jù)是分開存儲的
數(shù)據(jù)保存在內(nèi)存中某個(gè)位置,通過地址來標(biāo)記
變量保存的是數(shù)據(jù)的地址,通過地址可以找到數(shù)據(jù)在內(nèi)存空間的位置
把變量保存數(shù)據(jù)地址的過程稱為引用
變量的重新賦值修改的是變量中引用數(shù)據(jù)的內(nèi)存地址
變量之間的賦值實(shí)際是引用的傳遞
函數(shù)參數(shù)的傳遞,本質(zhì)也是引用的傳遞
函數(shù)的返回值本身也是引用的傳遞
可變和不可變類型
不可變類型,內(nèi)存中的數(shù)據(jù)不允許被修改:數(shù)字類型(int,bool,float,complex,long(2,x)、字符串、元組(tuple)
可變類型,內(nèi)存中的數(shù)據(jù)可以被修改:列表list、字典dict
無論是可變還是不可變數(shù)據(jù)類型,通過賦值語句,都會(huì)改變變量的引用
Hash函數(shù)只能接收不可變數(shù)據(jù)類型,字典的鍵也只能是不可變數(shù)據(jù)類型,字典的value值可以是任意數(shù)據(jù)類型
局部變量
1.在函數(shù)內(nèi)部定義的變量就是局部變量(作用范圍只能是當(dāng)前函數(shù)內(nèi)部)
2.在函數(shù)外部無法直接訪問局部變量
3.不同的函數(shù)中可以定義同名的局部變量
4.局部變量的生命周期:從定義變量時(shí)開始,到函數(shù)運(yùn)行結(jié)束
全局變量
1.在所有函數(shù)外邊定義的變量就是全局變量
2.讓所有函數(shù)都能訪問到,可以作為函數(shù)通信的橋梁
3.一般情況下,為了和普通變量的區(qū)別,需要加上g_或gl_前綴
4.全局變量一般放在所有函數(shù)的最上面
5.在函數(shù)內(nèi)部修改全局變量,必須要加上global關(guān)鍵字,如果不加global只是定義了一個(gè)同名的局部變量
函數(shù)的多個(gè)返回值
Python 值傳遞,引用傳遞
常見的參數(shù)傳遞有 2 種:值傳遞和引用傳遞。所謂值傳遞,通常就是拷貝參數(shù)的值,然后傳遞給函數(shù)里的新變量。這樣,原變量和新變量之間互相獨(dú)立,互不影響。
所謂引用傳遞,通常是指把參數(shù)的引用傳給新的變量,這樣,原變量和新變量就會(huì)指向同一塊內(nèi)存地址。如果改變了其中任何一個(gè)變量的值,那么另外一個(gè)變量也會(huì)相應(yīng)地隨之改變。
在 Python 中:
變量的賦值,只是表示讓變量指向了某個(gè)對象,并不表示拷貝對象給變量;而一個(gè)對象,可以被多個(gè)變量所指向。
可變對象(列表,字典,集合等等)的改變,會(huì)影響所有指向該對象的變量。
對于不可變對象(字符串、整型、元組等等),所有指向該對象的變量的值總是一樣的,也不會(huì)改變。但是通過某些操作(+= 等等)更新不可變對象的值時(shí),會(huì)返回一個(gè)新的對象。
變量可以被刪除,但是對象無法被刪除。
當(dāng)前文章:Python函數(shù)之間引用 python函數(shù)必須先定義再引用
地址分享:http://fisionsoft.com.cn/article/dodihig.html