閉包的概念
在計(jì)算機(jī)科學(xué)中,閉包(英語(yǔ):Closure),又稱詞法閉包(Lexical Closure)或函數(shù)閉包(function closures),是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外。
在一些語(yǔ)言中,在函數(shù)中可以(嵌套)定義另一個(gè)函數(shù)時(shí),如果內(nèi)部的函數(shù)引用了外部的函數(shù)的變量,則可能產(chǎn)生閉包。運(yùn)行時(shí),一旦外部的 函數(shù)被執(zhí)行,一個(gè)閉包就形成了,閉包中包含了內(nèi)部函數(shù)的代碼,以及所需外部函數(shù)中的變量的引用。
函數(shù)名稱的引用傳遞
def func():
print("--- func is run ----")
func()
ret = func
print(id(ret))
print(id(func))
ret()
運(yùn)行結(jié)果:
--- func is run ----
56145576
56145576
--- func is run ----
由上圖可知,和變量名一樣的,函數(shù)名只是函數(shù)代碼空間的引用,當(dāng)函數(shù)名賦值給一個(gè)對(duì)象的時(shí)候就是引用傳遞。
局部-全局變量
定義在方法內(nèi)的變量是局部變量,不能在方法外做引用;定義在模塊最外層的變量是全局變量,它是全局范圍內(nèi)可見的。
那么問(wèn)題來(lái)了,當(dāng)方法內(nèi)部有嵌套方法時(shí),嵌套方法能否使用父方法中定義的局部變量呢?答案是可以。
def outer_func():
data = 520
def inner_func():
return data
return inner_func()
print(outer_func())
運(yùn)行結(jié)果:
520
此時(shí)調(diào)用 outer_func() 函數(shù)的返回值就是 520,所以說(shuō)嵌套方法可以使用父方法中聲明的局部變量。
閉包的寫法
上面的概念還算比較容易理解,那么什么是閉包呢?我們來(lái)看下面一段代碼:
def outer_func():
data = 520
def inner_func():
return data
return inner_func
print(outer_func())
result = outer_func()
print(result())
運(yùn)行結(jié)果:
.inner_func at 0x02D8B6A8>
520
閉包的執(zhí)行流程圖
執(zhí)行第 11 行代碼:
先執(zhí)行 print() 函數(shù)中的 outer_funcf() 函數(shù),并將內(nèi)層函數(shù) inner_func() 函數(shù)的內(nèi)存地址進(jìn)行返回,最終 print() 函數(shù)將 return 返回的內(nèi)層函數(shù)地址進(jìn)行打印輸出。
執(zhí)行第 13 行代碼: 鄭州看婦科的醫(yī)院 http://www.ytsgfk120.com/
先執(zhí)行等號(hào)右側(cè)的 outer_func () 函數(shù),最終返回 inner_func() 函數(shù)的地址引用。等號(hào)左側(cè) result 變量進(jìn)行接收內(nèi)層函數(shù)地址。
執(zhí)行第 15 行代碼:
先執(zhí)行 print() 函數(shù)中 result() 函數(shù),因?yàn)?result 變量保存了內(nèi)層函數(shù) inner_func() 函數(shù)的地址,所以 result 變量后面加上括號(hào)就相當(dāng)于執(zhí)行 inner_func() 函數(shù)。執(zhí)行內(nèi)層函數(shù)并且將 data 值返回,最終使用 print() 函數(shù)將返回值打印輸出。
修改外部函數(shù)中的變量
nonlocal 關(guān)鍵字用來(lái)在函數(shù)或其他作用域中使用外層的(非全局)變量,修飾變量后表示該變量是上一級(jí)函數(shù)中的局部變量,如果上一級(jí)函數(shù)中不存在該局部變量,nonlocal 位置會(huì)發(fā)生錯(cuò)誤(最上層的函數(shù)使用 nonlocal 修飾變量必定會(huì)報(bào)錯(cuò))。
data = 20
def outer_func():
data = 0
def inner_func():
nonlocal data
data = 666
print("--- inner_func ---:",data)
inner_func()
print("--- outer_func ---:",data)
outer_func()
print("--- 函數(shù)外 ---:",data)
運(yùn)行結(jié)果:
--- inner_func ---: 666
--- outer_func ---: 666
--- 函數(shù)外 ---: 20
總結(jié)
函數(shù)名只是函數(shù)代碼空間的引用,當(dāng)函數(shù)名賦值給一個(gè)對(duì)象的時(shí)候就是引用傳遞
定義在方法內(nèi)的變量是局部變量,不能在方法外做引用,但是可以被內(nèi)層函數(shù)引用。
閉包就是一個(gè)嵌套定義的函數(shù),在外層運(yùn)行時(shí)才開始內(nèi)層函數(shù)的定義,然后將內(nèi)部函數(shù)的引用傳遞給函數(shù)外的對(duì)象
內(nèi)部函數(shù)和使用的外部函數(shù)提供的變量構(gòu)成的整體稱為閉包。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站題目:Python語(yǔ)法之閉包-創(chuàng)新互聯(lián)
路徑分享:http://jinyejixie.com/article20/cecijo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、外貿(mào)網(wǎng)站建設(shè)、定制網(wǎng)站、靜態(tài)網(wǎng)站、面包屑導(dǎo)航、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容