Python中的閉包

php對(duì)閉包的定義是匿名函數(shù),我之前對(duì)python閉包的理解是:外部函數(shù)以內(nèi)部函數(shù)作為返回值革半,稱之為閉包1ā!S止佟(錯(cuò)的延刘,1、不是以內(nèi)部函數(shù)作為返回值赏胚,是返回內(nèi)部函數(shù)的引用访娶;2、閉包是對(duì)變量作用域的應(yīng)用)
最近在重新看Python一些基礎(chǔ)的東西觉阅,突然發(fā)現(xiàn)之前自己對(duì)python閉包的概念理解是特么錯(cuò)的崖疤!

在解釋閉包之前,先說一個(gè)定義:Python中如果在一個(gè)函數(shù)的內(nèi)部定義了另一個(gè)函數(shù)典勇,外部的我們叫他外函數(shù)劫哼,內(nèi)部的我們叫他內(nèi)函數(shù)。

閉包:

在一個(gè)外函數(shù)中定義了一個(gè)內(nèi)函數(shù)割笙,內(nèi)函數(shù)里運(yùn)用了外函數(shù)的臨時(shí)變量权烧,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用。這樣就構(gòu)成了一個(gè)閉包伤溉。(要知道必須要用到外部的函數(shù)臨時(shí)變量才能稱之為閉包般码,閉包是對(duì)變量作用域的應(yīng)用,而不是簡(jiǎn)單地返回一個(gè)函數(shù))

有點(diǎn)青澀難懂乱顾,上代碼吧:

# outer是外部函數(shù) a和b都是外函數(shù)的臨時(shí)變量(你也可以稱之為環(huán)境變量)
def outer( a ):
    b = 10
    # inner是內(nèi)函數(shù)
    def inner():
        #在內(nèi)函數(shù)中 用到了外函數(shù)的臨時(shí)變量
        print(a+b)
    # 外函數(shù)的返回值是內(nèi)函數(shù)的引用
    return inner

if __name__ == '__main__':
    # 在這里我們調(diào)用外函數(shù)傳入?yún)?shù)5
    #此時(shí)外函數(shù)兩個(gè)臨時(shí)變量 a是5 b是10 板祝,并創(chuàng)建了內(nèi)函數(shù),然后把內(nèi)函數(shù)的引用返回存給了demo
    # 外函數(shù)結(jié)束的時(shí)候發(fā)現(xiàn)內(nèi)部函數(shù)將會(huì)用到自己的臨時(shí)變量走净,這兩個(gè)臨時(shí)變量就不會(huì)釋放券时,會(huì)綁定給這個(gè)內(nèi)部函數(shù)
    demo = outer(5)
    # 我們調(diào)用內(nèi)部函數(shù),看一看內(nèi)部函數(shù)是不是能使用外部函數(shù)的臨時(shí)變量
    # demo存了外函數(shù)的返回值伏伯,也就是inner函數(shù)的引用橘洞,這里相當(dāng)于執(zhí)行inner函數(shù)
    demo() # 15

    demo2 = outer(7)
    demo2()#17

如何在閉包的內(nèi)部函數(shù)修改外部函數(shù)的臨時(shí)變量:

1、在python3中说搅,可以用nonlocal 關(guān)鍵字聲明 一個(gè)變量炸枣, 表示這個(gè)變量不是局部變量空間的變量,需要向上一層變量空間找這個(gè)變量。

2抛虏、使用可變類型數(shù)據(jù)博其,比如list和dict!

# outer是外部函數(shù) a和b都是外函數(shù)的臨時(shí)變量
def outer( a ):
    b = 10  # a和b都是閉包變量
    c = [a] #這里對(duì)應(yīng)修改閉包變量的方法2
    # inner是內(nèi)函數(shù)
    def inner():
        #內(nèi)函數(shù)中想修改閉包變量
        # 方法1 nonlocal關(guān)鍵字聲明
        nonlocal  b
        b+=1
        # 方法二迂猴,把閉包變量修改成可變數(shù)據(jù)類型 比如列表
        c[0] += 1
        print(c[0])
        print(b)
    # 外函數(shù)的返回值是內(nèi)函數(shù)的引用
    return inner

if __name__ == '__main__':

    demo = outer(5)
    demo() # 6  11

還有一點(diǎn)需要注意:
使用閉包的過程中慕淡,一旦外函數(shù)被調(diào)用一次返回了內(nèi)函數(shù)的引用,雖然每次調(diào)用內(nèi)函數(shù)沸毁,是開啟一個(gè)函數(shù)執(zhí)行過后消亡峰髓,但是閉包變量實(shí)際上只有一份,每次開啟內(nèi)函數(shù)都在使用同一份閉包變量

def outer(x):
    def inner(y):
        nonlocal x
        x+=y
        return x
    return inner

a = outer(10)
print(a(1)) //11
print(a(3)) //14
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末息尺,一起剝皮案震驚了整個(gè)濱河市携兵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搂誉,老刑警劉巖徐紧,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異炭懊,居然都是意外死亡并级,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門侮腹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘲碧,“玉大人,你說我怎么就攤上這事父阻∮” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵加矛,是天一觀的道長(zhǎng)履婉。 經(jīng)常有香客問我,道長(zhǎng)斟览,這世上最難降的妖魔是什么谐鼎? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮趣惠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘身害。我一直安慰自己味悄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布塌鸯。 她就那樣靜靜地躺著侍瑟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涨颜,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天费韭,我揣著相機(jī)與錄音,去河邊找鬼庭瑰。 笑死星持,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弹灭。 我是一名探鬼主播督暂,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼穷吮!你這毒婦竟也來了逻翁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捡鱼,失蹤者是張志新(化名)和其女友劉穎八回,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驾诈,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缠诅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翘鸭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滴铅。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖就乓,靈堂內(nèi)的尸體忽然破棺而出汉匙,到底是詐尸還是另有隱情,我是刑警寧澤生蚁,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布噩翠,位于F島的核電站,受9級(jí)特大地震影響邦投,放射性物質(zhì)發(fā)生泄漏伤锚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一志衣、第九天 我趴在偏房一處隱蔽的房頂上張望屯援。 院中可真熱鬧,春花似錦念脯、人聲如沸狞洋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吉懊。三九已至庐橙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間借嗽,已是汗流浹背态鳖。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恶导,地道東北人浆竭。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像甲锡,于是被迫代替她去往敵國(guó)和親兆蕉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 目錄 作用域(scope) 閉包的定義 閉包的作用 總結(jié) 2018.4.15更新了對(duì)于函數(shù)作用域的理解內(nèi)容 1.作...
    苦逼李閱讀 684評(píng)論 1 0
  • 什么是閉包?閉包有什么用缸废?為什么要用閉包包蓝?今天我們就帶著這3個(gè)問題來一步一步認(rèn)識(shí)閉包。 閉包和函數(shù)緊密聯(lián)系在一起企量,...
    碼農(nóng)小楊閱讀 360評(píng)論 0 2
  • 原文出處: cicaday Python中的閉包不是一個(gè)一說就能明白的概念测萎,但是隨著你往學(xué)習(xí)的深入,無(wú)論如何你都需...
    PyChina閱讀 405評(píng)論 0 1
  • 閉包(closure)是函數(shù)式編程的重要的語(yǔ)法結(jié)構(gòu)届巩。閉包也是一種組織代碼的結(jié)構(gòu)硅瞧,它同樣提高了代碼的可重復(fù)使用性。 ...
    田飛雨閱讀 3,302評(píng)論 5 13
  • 導(dǎo)讀:Python中的裝飾器經(jīng)常用于有切面需求的場(chǎng)景恕汇,較為經(jīng)典的有插入日志腕唧、性能測(cè)試、事務(wù)處理等瘾英。本文從閉包的概念...
    zgjx閱讀 439評(píng)論 0 3