閉包:?
在一個(gè)外函數(shù)中定義了一個(gè)內(nèi)函數(shù)周霉,內(nèi)函數(shù)里運(yùn)用了外函數(shù)的臨時(shí)變量掂器,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用。這樣就構(gòu)成了一個(gè)閉包俱箱。
一般情況下国瓮,在我們認(rèn)知當(dāng)中,如果一個(gè)函數(shù)結(jié)束狞谱,函數(shù)的內(nèi)部所有東西都會(huì)釋放掉乃摹,還給內(nèi)存,局部變量都會(huì)消失跟衅。但是閉包是一種特殊情況孵睬,如果外函數(shù)在結(jié)束的時(shí)候發(fā)現(xiàn)有自己的臨時(shí)變量將來(lái)會(huì)在內(nèi)部函數(shù)中用到,就把這個(gè)臨時(shí)變量綁定給了內(nèi)部函數(shù)伶跷,然后自己再結(jié)束掰读。
#閉包函數(shù)的實(shí)例
# outer是外部函數(shù) a和b都是外函數(shù)的臨時(shí)變量
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