摘要:在嵌套函數(shù)中訪(fǎng)問(wèn)了最外層函數(shù)的參數(shù),結(jié)果我們是能正常訪(fǎng)問(wèn)閉包我們將上面的最外層的返回值修改為返回嵌套函數(shù)的引用一切皆對(duì)象根據(jù)前面變量生存期例子,按理說(shuō)調(diào)用完的生命周期應(yīng)該結(jié)束了,調(diào)用應(yīng)該失敗才對(duì),但是實(shí)際卻調(diào)用成功了。
復(fù)習(xí)
python引用變量的順序: 當(dāng)前作用域局部變量 -> 外層作用域變量 -> 當(dāng)前模塊中的全局變量 -> python內(nèi)置變量
global:聲明一個(gè)全局變量
nonlocal:用來(lái)在函數(shù)或其他作用域中使用外層(非全局)變量
對(duì)于global跟nonlocal請(qǐng)點(diǎn)擊 python3中g(shù)lobal 和 nonlocal 的作用域
變量生存期我們寫(xiě)個(gè)簡(jiǎn)單的變量生存期的小例子
def transmit_to_space(message): print(message) print(transmit_to_space("Test message")) print(message) # 報(bào)錯(cuò) NameError: name "message" is not defined嵌套函數(shù)
Python 允許函數(shù)中有函數(shù),即為嵌套函數(shù)。
def transmit_to_space(message): "This is the enclosing function" def data_transmitter(): "The nested function" print(message) data_transmitter() print(transmit_to_space("Test message"))
在嵌套函數(shù)中訪(fǎng)問(wèn)了最外層函數(shù)的參數(shù),結(jié)果我們是能正常訪(fǎng)問(wèn) message
閉包我們將上面的最外層(enclosing function) 的返回值修改為返回嵌套函數(shù)的引用(Python一切皆對(duì)象)
def transmit_to_space(message): "This is the enclosing function" def data_transmitter(): "The nested function" print(message) return data_transmitter fun2 = transmit_to_space("Burn the Sun!") fun2()
根據(jù)前面變量生存期例子,按理說(shuō) transmit_to_space("Burn the Sun!") 調(diào)用完 message 的生命周期應(yīng)該結(jié)束了,fun2調(diào)用應(yīng)該失敗才對(duì),但是實(shí)際卻調(diào)用成功了。
其實(shí)這里涉及到了閉包,我們查看 fun2 的 __closure__ 屬性 (python2下是func_closure)。看到有一個(gè)cell對(duì)象,里面值就是 message 的內(nèi)容。
所以閉包是: 嵌套定義在非全局作用域里面的函數(shù)能夠記住它在被定義的時(shí)候它所處的封閉命名空間。(只會(huì)記住被嵌套函數(shù)使用的值,如果enclosing function 里面還定義了其他的值,封閉作用域里面是不會(huì)有的)
看下面例子的變化
我們?cè)黾右粋€(gè)參數(shù),但是嵌套函數(shù)中未使用這個(gè)參數(shù),發(fā)現(xiàn)fun2就沒(méi)有再記住這個(gè)值。
更多鏈接:Python閉包詳解
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41786.html
摘要:最簡(jiǎn)單的說(shuō)法,即是在最原始的集合論樸素集合論中的定義,集合就是一堆東西。若然是集合的元素,記作。這里對(duì)被數(shù)學(xué)家們稱(chēng)為直觀(guān)的或樸素的集合論進(jìn)行一個(gè)簡(jiǎn)短而基本的介紹更詳細(xì)的分析可見(jiàn)樸素集合論。對(duì)集合進(jìn)行嚴(yán)格的公理推導(dǎo)可見(jiàn)公理化集合論。 回顧一下已經(jīng)了解的數(shù)據(jù)類(lèi)型:int/str/bool/list/dict/tuple 還真的不少了. 不過(guò),python是一個(gè)發(fā)展的語(yǔ)言,沒(méi)準(zhǔn)以后還出別...
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開(kāi)始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊?,否則只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:中有三種數(shù)據(jù)結(jié)構(gòu)棧堆隊(duì)列。前端進(jìn)擊的巨人一執(zhí)行上下文與執(zhí)行棧,變量對(duì)象中解釋執(zhí)行棧時(shí),舉了一個(gè)乒乓球盒子的例子,來(lái)演示棧的存取方式,這里再舉個(gè)栗子搭積木。對(duì)于基本類(lèi)型,棧中存儲(chǔ)的就是它自身的值,所以新內(nèi)存空間存儲(chǔ)的也是一個(gè)值。 面試經(jīng)常遇到的深淺拷貝,事件輪詢(xún),函數(shù)調(diào)用棧,閉包等容易出錯(cuò)的題目,究其原因,都是跟JavaScript基礎(chǔ)知識(shí)不牢固有關(guān),下層地基沒(méi)打好,上層就是豆腐渣工程,...
摘要:?jiǎn)栴}在說(shuō)閉包,一定會(huì)牽涉到作用域。這也是閉包的屬性的,能夠記錄下內(nèi)部函數(shù)引用外部的值。因?yàn)槎际侨肿兞浚匝h(huán)也就是不斷值覆蓋,閉包并不會(huì)記錄在循環(huán)時(shí)的值,只會(huì)記錄閉包變量。閉包時(shí)記錄的除了閉包變量還有塊級(jí)作用域變量最后來(lái)看看這個(gè)輸出什么 js 是非常靈活的語(yǔ)言,寫(xiě)起來(lái)真是* 不過(guò)現(xiàn)在有了typescript,寫(xiě)起來(lái)舒服多了。 問(wèn)題 在說(shuō)js閉包,一定會(huì)牽涉到作用域。而一般在區(qū)別 v...
摘要:模塊化是隨著前端技術(shù)的發(fā)展,前端代碼爆炸式增長(zhǎng)后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調(diào)也不等同于異步。將會(huì)討論安全的類(lèi)型檢測(cè)惰性載入函數(shù)凍結(jié)對(duì)象定時(shí)器等話(huà)題。 Vue.js 前后端同構(gòu)方案之準(zhǔn)備篇——代碼優(yōu)化 目前 Vue.js 的火爆不亞于當(dāng)初的 React,本人對(duì)寫(xiě)代碼有潔癖,代碼也是藝術(shù)。此篇是準(zhǔn)備篇,工欲善其事,必先利其器。我們先在代...
閱讀 2901·2021-11-16 11:55
閱讀 2655·2021-09-29 09:34
閱讀 3500·2021-09-01 14:21
閱讀 3823·2019-08-29 12:36
閱讀 727·2019-08-26 10:55
閱讀 4034·2019-08-26 10:20
閱讀 1058·2019-08-23 18:19
閱讀 1229·2019-08-23 17:56