python函數(shù)局域變量,python函數(shù)內(nèi)部全局變量

python中使用閉包及修改外部函數(shù)的局部變量

在python中,函數(shù)可以被嵌套定義,也就是說,函數(shù)中可以定義函數(shù)。該函數(shù)還可以將其內(nèi)部定義的函數(shù)作為返回值返回。

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

閉包的定義:一般來說,我們可以認(rèn)為,如果一個(gè)函數(shù)可以讀取其他函數(shù)中的局部變量,那么它們就構(gòu)成了閉包。

注意 :閉包的定義不是特別清晰,但大體上的意思是這樣的。

我們知道,普通的函數(shù)是可以使用全局變量的

類似的,函數(shù)中定義的函數(shù),也是可以使用外部函數(shù)的變量的。因此,滿足了函數(shù)讀取了其他函數(shù)局部變量的這一條件,他們因此構(gòu)成了閉包。

在閉包的使用中,我們可以先給外部的函數(shù)賦予不同的局部變量,然后再調(diào)用其中內(nèi)部的函數(shù)時(shí),就可以讀取到這些不同的局部變量了。

外部變量的使用 在普通函數(shù)中,雖然可以直接使用全局變量,但是不可以直接修改全局變量。從變量的作用域來說,一旦你嘗試修改全局變量,那么就會嘗試創(chuàng)建并使用一個(gè)同名的局部變量。因此,如果你需要在普通函數(shù)中修改全局變量,需要使用global

同樣的,如果你希望通過定義在內(nèi)部的函數(shù)去修改其外部函數(shù)的變量,那么必須使用nonlocal

關(guān)于python 函數(shù)的變量問題

Python在heap中分配的對象分成兩類:可變對象和不可變對象。所謂可變對象是指,對象的內(nèi)容是可變的,例如list。而不可變的對象則相反,表示其內(nèi)容不可變。

不可變對象:int,string,float,tuple

可變對象 :list,dictionary

所以,如果a,b是可變對象,當(dāng)b傳給 h(a), a和b就引用了同一個(gè)對象,修改了a對象的值,就相當(dāng)于修改了b對象的值。

如果a,b用的int對象,那a,b不可變的對象的特征沒有變(原對象的值并沒有改變),變的只是創(chuàng)建了新對象,改變了變量的對象引用。

def h(a):

a=123

b=456

h(b)

print b #結(jié)果是456

順便說一下,你這個(gè)例子運(yùn)行后的結(jié)果其實(shí)是['456'],不信你可以寫個(gè)程序跑一下,因?yàn)閍=['123]并不是修改對象的內(nèi)容,而是讓a指向了新的對象引用,所以,最后b的內(nèi)容還是['456']。

改成a[0]=123,才是你期望的結(jié)果。

解析Python函數(shù)變量如何使用

剛學(xué)用Python的時(shí)候,特別是看一些庫的源碼時(shí),經(jīng)常會看到func(*args, **kwargs)這樣的函數(shù)定義,這個(gè)*和**讓人有點(diǎn)費(fèi)解。其實(shí)只要把函數(shù)參數(shù)定義搞清楚了,就不難理解了。

先說說函數(shù)定義,我們都知道,下面的代碼定義了一個(gè)函數(shù)funcA

def funcA():

pass

顯然,函數(shù)funcA沒有參數(shù)(同時(shí)啥也不干:D)。

下面這個(gè)函數(shù)funcB就有兩個(gè)參數(shù)了,

def funcB(a, b):

print a

print b

調(diào)用的時(shí)候,我們需要使用函數(shù)名,加上圓括號擴(kuò)起來的參數(shù)列表,比如 funcB(100, 99),執(zhí)行結(jié)果是:

100

99

很明顯,參數(shù)的順序和個(gè)數(shù)要和函數(shù)定義中一致,如果執(zhí)行funcB(100),Python會報(bào)錯的:

TypeError: funcB() takes exactly 2 arguments (1 given)

我們可以在函數(shù)定義中使用參數(shù)默認(rèn)值,比如

def funcC(a, b=0):

print a

print b

在函數(shù)funcC的定義中,參數(shù)b有默認(rèn)值,是一個(gè)可選參數(shù),如果我們調(diào)用funcC(100),b會自動賦值為0。

OK,目前為止,我們要定義一個(gè)函數(shù)的時(shí)候,必須要預(yù)先定義這個(gè)函數(shù)需要多少個(gè)參數(shù)(或者說可以接受多少個(gè)參數(shù))。一般情況下這是沒問題的,但是也有在定義函數(shù)的時(shí)候,不能知道參數(shù)個(gè)數(shù)的情況(想一想C語言里的printf函數(shù)),在Python里,帶*的參數(shù)就是用來接受可變數(shù)量參數(shù)的。看一個(gè)例子

def funcD(a, b, *c):

print a

print b

print "length of c is: %d " % len(c)

print c

調(diào)用funcD(1, 2, 3, 4, 5, 6)結(jié)果是

1

2

length of c is: 4

(3, 4, 5, 6)

我們看到,前面兩個(gè)參數(shù)被a、b接受了,剩下的4個(gè)參數(shù),全部被c接受了,c在這里是一個(gè)tuple。我們在調(diào)用funcD的時(shí)候,至少要傳遞2個(gè)參數(shù),2個(gè)以上的參數(shù),都放到c里了,如果只有兩個(gè)參數(shù),那么c就是一個(gè)empty tuple。

好了,一顆星我們弄清楚了,下面輪到兩顆星。

上面的例子里,調(diào)用函數(shù)的時(shí)候,傳遞的參數(shù)都是根據(jù)位置來跟函數(shù)定義里的參數(shù)表匹配的,比如funcB(100, 99)和funcB(99, 100)的執(zhí)行結(jié)果是不一樣的。在Python里,還支持一種用關(guān)鍵字參數(shù)(keyword argument)調(diào)用函數(shù)的辦法,也就是在調(diào)用函數(shù)的時(shí)候,明確指定參數(shù)值付給那個(gè)形參。比如還是上面的funcB(a, b),我們通過這兩種方式調(diào)用

funcB(a=100, b=99)

funcB(b=99, a=100)

結(jié)果跟funcB(100, 99)都是一樣的,因?yàn)槲覀冊谑褂藐P(guān)鍵字參數(shù)調(diào)用的時(shí)候,指定了把100賦值給a,99賦值給b。也就是說,關(guān)鍵字參數(shù)可以讓我們在調(diào)用函數(shù)的時(shí)候打亂參數(shù)傳遞的順序!

另外,在函數(shù)調(diào)用中,可以混合使用基于位置匹配的參數(shù)和關(guān)鍵字參數(shù),前題是先給出固定位置的參數(shù),比如

def funcE(a, b, c):

print a

print b

print c

調(diào)用funcE(100, 99, 98)和調(diào)用funcE(100, c=98, b=99)的結(jié)果是一樣的。

好了,經(jīng)過以上鋪墊,兩顆星總算可以出場了:

如果一個(gè)函數(shù)定義中的最后一個(gè)形參有 ** (雙星號)前綴,所有正常形參之外的其他的關(guān)鍵字參數(shù)都將被放置在一個(gè)字典中傳遞給函數(shù),比如:

def funcF(a, **b):

print a

for x in b:

print x + ": " + str(b[x])

調(diào)用funcF(100, c='你好', b=200),執(zhí)行結(jié)果

100

c: 你好

b: 200

大家可以看到,b是一個(gè)dict對象實(shí)例,它接受了關(guān)鍵字參數(shù)b和c。

python函數(shù)中局部變量與全局變量遵守規(guī)則

(1)簡單數(shù)據(jù)類型變量無論是否與全局變量重名,僅在函數(shù)內(nèi)部創(chuàng)建和使用,函數(shù)退出后變量被釋放,如有全局同名變量,其值不變。

(2)簡單數(shù)據(jù)類型變量在用global保留字聲明后,作為全局變量使用,函數(shù)退出后該變量保留且值被函數(shù)改變。

(3)對于組合數(shù)據(jù)類型的全局變量,如果在函數(shù)內(nèi)部沒有被真實(shí)創(chuàng)建的同名變量,則函數(shù)內(nèi)部可以直接使用并修改全局變量的值。

(4)如果函數(shù)內(nèi)部真實(shí)創(chuàng)建了組合數(shù)據(jù)類型變量,無論是否有同名全局變量,函數(shù)僅對局部變量進(jìn)行操作,函數(shù)退出后局部變量被釋放,全局變量值不變。

*《python語言程序設(shè)計(jì)基礎(chǔ)》.高等教育出版社

分享名稱:python函數(shù)局域變量,python函數(shù)內(nèi)部全局變量
網(wǎng)頁鏈接:http://m.kartarina.com/article44/dseejhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃App設(shè)計(jì)外貿(mào)建站移動網(wǎng)站建設(shè)品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)
主站蜘蛛池模板: 中文字幕av无码专区第一页| 亚洲精品无码你懂的网站| 无码丰满少妇2在线观看| 亚洲国产成人精品无码区在线秒播 | 在线精品自拍无码| 日韩av无码久久精品免费| 无码熟妇人妻AV影音先锋| 中文无码精品一区二区三区| 亚洲日韩乱码中文无码蜜桃 | 国产AV无码专区亚洲AVJULIA | 中文字幕韩国三级理论无码| 国产成人无码a区在线观看视频免费| 亚洲成AV人片天堂网无码| 国产成人无码a区在线观看视频免费 | 亚洲AV无码资源在线观看| 精品国产毛片一区二区无码| 亚洲av无码久久忘忧草| 高潮潮喷奶水飞溅视频无码| 国产成人无码区免费A∨视频网站| 99国产精品无码| 人妻中文字幕无码专区| 国产成人AV一区二区三区无码| 国产成人无码免费视频97| 国产成人无码精品久久久小说| 97碰碰碰人妻视频无码| 国产三级无码内射在线看| 成人免费无码H在线观看不卡| 无码一区二区三区AV免费| 无码精品国产dvd在线观看9久| 人妻少妇乱子伦无码视频专区 | 日韩精品无码成人专区| 日本无码一区二区三区白峰美 | 久久久久无码精品国产app| 亚洲午夜无码久久久久软件| 久久精品中文无码资源站| 无码成A毛片免费| 18精品久久久无码午夜福利| 无码国内精品久久人妻| 久久久久亚洲AV片无码下载蜜桃| 无码AV岛国片在线播放| 69天堂人成无码麻豆免费视频|