什么是閉包
Objects are data with methods attached. Closures are functions with data attached.
一般來(lái)說(shuō),我們都非常熟悉面向?qū)ο?OOD)語(yǔ)言中的對(duì)象的概念。所謂對(duì)象(Object),指的是附帶相應(yīng)方法的__數(shù)據(jù)__。那么相對(duì)而言,閉包(closure)指的則是附帶相應(yīng)數(shù)據(jù)的__函數(shù)__。換句話(huà)說(shuō),閉包函數(shù)能夠引用一些并不在當(dāng)前代碼全局上下文中定義的變量。這些被引用的變量(稱(chēng)為自由變量)是在閉包函數(shù)被定義的位置的所在的代碼中定義的。這樣的一些函數(shù)被稱(chēng)為閉包。
Python中的閉包
由于在Python中,函數(shù)也是第一類(lèi)對(duì)象,所以與字符串,數(shù)字或其他任何我們所熟悉的對(duì)象一樣,函數(shù)也可以被賦值給一個(gè)變量,作為另一個(gè)函數(shù)的返回值,或作為一個(gè)輸入?yún)?shù)傳遞給另一個(gè)函數(shù)。這就使得定義閉包非常的方便,如下面的例子所示。
def
constant_adder
(
x
)
:
constant
=
x
def
adder
(
y
)
:
y
=
y
+
constant
return
y
return
adder
# Given the above function
>>
>
f1
=
constant_adder
(
1
)
>>
>
f1
(
2
)
>>
>
3
>>
>
f2
=
constant_adder
(
10
)
>>
>
f2
(
2
)
>>
>
12
在上述例子中,我們可以發(fā)現(xiàn)在調(diào)用
f1
和
f2
的時(shí)候,
constant_adder
的作用域事實(shí)上已經(jīng)結(jié)束。這里的
constant
就是一個(gè)自由變量,我們?nèi)匀辉?
f1
和
f2
中調(diào)用了在
constant_adder
中的定義的
constant
變量,這就是一個(gè)附帶相應(yīng)數(shù)據(jù)的函數(shù)。
另外,在Python3.x以前,我們只能在閉包中取得自由變量的值,但無(wú)法改變自由變量的值。重新賦值自由變量的行為將會(huì)導(dǎo)致一個(gè)作用域?yàn)楫?dāng)前函數(shù)的局部變量的產(chǎn)生。Python3.0引入了
nonlocal
關(guān)鍵字,使得我們不僅能夠讀取自由變量,也能夠重新賦值自由變量。如下面的例子所示。
def
foo
(
)
:
x
=
1
def
show
(
)
:
print
(
"x is {}"
.
format
(
x
)
)
def
change
(
)
:
nonlocal
x
x
=
2
return
show
,
change
# Given the above function
>>
>
show
,
change
=
foo
(
)
>>
>
show
(
)
>>
>
x
is
1
>>
>
change
(
)
>>
>
show
(
)
>>
>
x
is
2
Reference
https://stackoverflow.com/questions/13857/can-you-explain-closures-as-they-relate-to-python
http://mrevelle.blogspot.com/2006/10/closure-on-closures.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

