真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python的函數(shù)傳引用 python函數(shù)值傳遞和引用傳遞

python中變量的引用、可變和不可變類型、局部變量和全局變量

變量的引用

成都創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、漳浦網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、商城開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為漳浦等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

變量和數(shù)據(jù)都是保存在內(nèi)存中的

變量和數(shù)據(jù)是分開存儲(chǔ)的

數(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ù)調(diào)用是傳值還是傳引用

python中所有數(shù)據(jù)都是對(duì)象,所以傳參也是傳的對(duì)象的引用,這個(gè)引用在函數(shù)執(zhí)行前和執(zhí)行后是不會(huì)被改變的,如:

num

=

1

def

change(num):

print(id(num))

num

=

2

print(id(num))

執(zhí)行change(num)后num的值還是1

可以看到在執(zhí)行前num的id值(可以理解為內(nèi)存地址)是某一值

但在執(zhí)行change后,num的id值改變了,也就是說內(nèi)部的num指向了另外的對(duì)象,而外部的num卻還是指向原來的對(duì)象,所以值沒有變;

同理,如:

num_list

=

[1,2]

def

change_list(num_list):

print(id(num_list))

num_list.append(3)

print(id(num_list))

可以看到執(zhí)行change_list后num_list的id值沒有改變,也就是說num_list是在原來的對(duì)象上添加了新的數(shù)據(jù),外部的num_list也是指向這一對(duì)象,所以外部的num_list數(shù)據(jù)也添加了新的數(shù)據(jù)。

python函數(shù)傳對(duì)象對(duì)性能的影響

python函數(shù)傳對(duì)象對(duì)性能有影響。在Python中,一切皆對(duì)象,Python參數(shù)傳遞采用的都是“傳對(duì)象引用”的方式。實(shí)際上,這種方式相當(dāng)于傳值和傳引用的一種綜合。如果函數(shù)收到的是一個(gè)可變對(duì)象(比如字典或者列表)的引用,就能修改對(duì)象的原始值,相當(dāng)于通過“傳引用”來傳遞對(duì)象。如果函數(shù)收到的是一個(gè)不可變對(duì)象(比如數(shù)字、字符或者元組)的引用,就不能直接修改原始對(duì)象,相當(dāng)于通過“傳值’來傳遞對(duì)象,此時(shí)如果想改變這些變量的值,可以將這些變量申明為全局變量。

python函數(shù)調(diào)用的參數(shù)傳遞

python的函數(shù)參數(shù)傳遞是"引用傳遞(地址傳遞)"。

python中賦值語句的過程(x = 1):先申請(qǐng)一段內(nèi)存分配給一個(gè)整型對(duì)象來存儲(chǔ)數(shù)據(jù)1,然后讓變量x去指向這個(gè)對(duì)象,實(shí)際上就是指向這段內(nèi)存(這里有點(diǎn)和C語言中的指針類似)。

在Python中,會(huì)為每個(gè)層次生成一個(gè)符號(hào)表,里層能調(diào)用外層中的變量,而外層不能調(diào)用里層中的變量,并且當(dāng)外層和里層有同名變量時(shí),外層變量會(huì)被里層變量屏蔽掉。函數(shù)? 調(diào)用 ?會(huì)為函數(shù)局部變量生成一個(gè)新的符號(hào)表。

局部變量:作用于該函數(shù)內(nèi)部,一旦函數(shù)執(zhí)行完成,該變量就被回收。

全局變量:它是在函數(shù)外部定義的,作用域是整個(gè)文件。全局變量可以直接在函數(shù)里面應(yīng)用,但是如果要在函數(shù)內(nèi)部改變?nèi)肿兞?,必須使用global關(guān)鍵字進(jìn)行聲明。

注意 :默認(rèn)值在函數(shù)? 定義 ?作用域被解析

在定義函數(shù)時(shí),就已經(jīng)執(zhí)行力它的局部變量

python中不可變類型是共享內(nèi)存地址的:把相同的兩個(gè)不可變類型數(shù)據(jù)賦給兩個(gè)不同變量a,b,a,b在內(nèi)存中的地址是一樣的。

python中值傳遞還是引用傳遞?

首先,Python中一切事物皆對(duì)象,變量是對(duì)對(duì)象在內(nèi)存中的存儲(chǔ)和地址的抽象。所有的變量都可以理解是內(nèi)存中一個(gè)對(duì)象的“引用”,或者,也可以看似c中void*的感覺。

python中統(tǒng)一都是引用傳遞,同時(shí)要注意類型是屬于對(duì)象的,而不是變量。而對(duì)象有兩種,“可更改”(mutable)與“不可更改”(immutable)對(duì)象。在python中,strings, tuples, 和numbers是不可更改的對(duì)象,而list,dict等則是可以修改的對(duì)象。

當(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 上拿下來,貼到其他對(duì)象上,建立新的"引用"。

既然Python只允許引用傳遞,那有沒有辦法可以讓兩個(gè)變量不再指向同一內(nèi)存地址呢?

copy對(duì)于一個(gè)復(fù)雜對(duì)象的子對(duì)象并不會(huì)完全復(fù)制,什么是復(fù)雜對(duì)象的子對(duì)象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是復(fù)雜對(duì)象的子對(duì)象。對(duì)于子對(duì)象,python會(huì)把它當(dāng)作一個(gè)公共鏡像存儲(chǔ)起來,所有對(duì)他的復(fù)制都被當(dāng)成一個(gè)引用,所以說當(dāng)其中一個(gè)引用將鏡像改變了之后另一個(gè)引用使用鏡像的時(shí)候鏡像已經(jīng)被改變了。

deepcopy的時(shí)候會(huì)將復(fù)雜對(duì)象的每一層復(fù)制一個(gè)單獨(dú)的個(gè)體出來。 當(dāng)然其中主要的操作還是地址問題。

當(dāng)一個(gè)引用傳遞給函數(shù)的時(shí)候,函數(shù)自動(dòng)復(fù)制一份引用,這個(gè)函數(shù)里的引用和外邊的引用沒有半毛關(guān)系了.所以第一個(gè)例子里函數(shù)把引用指向了一個(gè)不可變對(duì)象,當(dāng)函數(shù)返回的時(shí)候,外面的引用沒半毛感覺.而第二個(gè)例子就不一樣了,函數(shù)內(nèi)的引用指向的是可變對(duì)象,對(duì)它的操作就和定位了指針地址一樣,在內(nèi)存里進(jìn)行修改.

引用計(jì)數(shù)

PyObject是每個(gè)對(duì)象必有的內(nèi)容,其中ob_refcnt就是做為引用計(jì)數(shù)。當(dāng)一個(gè)對(duì)象有新的引用時(shí),它的ob_refcnt就會(huì)增加,當(dāng)引用它的對(duì)象被刪除,它的ob_refcnt就會(huì)減少.引用計(jì)數(shù)為0時(shí),該對(duì)象生命就結(jié)束了。

優(yōu)點(diǎn):

缺點(diǎn):

Python 函數(shù)中,參數(shù)是傳值,還是傳引用

這個(gè)問題的答案無外乎這幾種說法:傳值,傳引用,對(duì)于可變對(duì)象是傳引用,不可變對(duì)象是傳值。

傳引用

先看下面這個(gè)例子:

def foo(n):

... print id(n)

... n = 3

... print id(n)

n = 2

id(n)

31030000L

foo(n)

31030000L

31029976L

n

2

id(n)

31030000L

由foo中兩次輸出不相等可以看出,傳引用說法并不成立。

傳值

來看下面的例子:

def foo(n):

... print n

... n.append(3)

... print n

n = [1, 2, 4, 8]

foo(n)

[1, 2, 4, 8]

[1, 2, 4, 8, 3]

n

[1, 2, 4, 8, 3]

按傳值的說法,一個(gè)值傳進(jìn)來,在函數(shù)內(nèi)改動(dòng)并不會(huì)影響變量本身的值,上面例子中n變量本身的值也被改變了,說明傳值的說法也不對(duì)。

3.可變對(duì)象傳引用,不可變對(duì)象傳值

相比上面兩種說法,這種說法似乎更靠譜,傳播也更為廣泛,那它到底對(duì)不對(duì)呢?

def foo(n):

... print id(n)

... n = ['1', '2', '3']

... print id(n)

... print n

n = [1,2,3,4,5,6]

id(n)

35637576

foo(n)

35637576

35916168

['1', '2', '3']

n

[1, 2, 3, 4, 5, 6]

按照可變對(duì)象傳引用的說法,上面list類型是可變對(duì)象,應(yīng)該傳引用,這foo方法中兩次調(diào)用id應(yīng)該輸出一樣的值,更改的結(jié)果也應(yīng)該影響到外部變量,但結(jié)果顯然不是這樣的,這說明,這種說法也是不正確的。

那么Python傳值的方法到底是什么樣呢?其實(shí)Python中的函數(shù)參數(shù)所遵循的是傳對(duì)象(call by object),或者叫做穿對(duì)象的引用(call by object reference)。在調(diào)用函數(shù)時(shí),將變量整個(gè)對(duì)象傳入,對(duì)于可變對(duì)象的修改,在函數(shù)內(nèi)外均可見;而對(duì)于不可變對(duì)象,因?yàn)槠洳⒉荒苷嬲饬x上被賦值,修改是通過生成新的對(duì)象來實(shí)現(xiàn)的。

下面來一個(gè)有趣的例子作為結(jié)尾:

def bar(a = []):

... print id(a)

... a.append(7)

... print a

for _ in range(5):

... bar()

#結(jié)果輸出請(qǐng)自己動(dòng)手實(shí)踐,原因應(yīng)該不難理解


文章名稱:python的函數(shù)傳引用 python函數(shù)值傳遞和引用傳遞
文章位置:http://weahome.cn/article/hgcghs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部