什么是閉包
Objects are data with methods attached. Closures are functions with data attached.
一般來說,我們都非常熟悉面向對象(OOD)語言中的對象的概念。所謂對象(Object),指的是附帶相應方法的__數據__。那么相對而言,閉包(closure)指的則是附帶相應數據的__函數__。換句話說,閉包函數能夠引用一些并不在當前代碼全局上下文中定義的變量。這些被引用的變量(稱為自由變量)是在閉包函數被定義的位置的所在的代碼中定義的。這樣的一些函數被稱為閉包。
Python中的閉包
由于在Python中,函數也是第一類對象,所以與字符串,數字或其他任何我們所熟悉的對象一樣,函數也可以被賦值給一個變量,作為另一個函數的返回值,或作為一個輸入參數傳遞給另一個函數。這就使得定義閉包非常的方便,如下面的例子所示。
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
在上述例子中,我們可以發現在調用
f1
和
f2
的時候,
constant_adder
的作用域事實上已經結束。這里的
constant
就是一個自由變量,我們仍然在
f1
和
f2
中調用了在
constant_adder
中的定義的
constant
變量,這就是一個附帶相應數據的函數。
另外,在Python3.x以前,我們只能在閉包中取得自由變量的值,但無法改變自由變量的值。重新賦值自由變量的行為將會導致一個作用域為當前函數的局部變量的產生。Python3.0引入了
nonlocal
關鍵字,使得我們不僅能夠讀取自由變量,也能夠重新賦值自由變量。如下面的例子所示。
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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
