一、概念
閉包(closure)是一種引用了非局部變量(non-local variable)的內(nèi)嵌函數(shù)(nested function)舞痰。
名詞解釋:
內(nèi)嵌函數(shù)(nested function):定義在其他函數(shù)內(nèi)部的函數(shù)叫內(nèi)嵌函數(shù)。內(nèi)嵌函數(shù)可以訪問所定義在的外部函數(shù)內(nèi)的變量。
非局部變量:非局部變量(non-local variable)在python中默認只讀型宙,如果想要修改它,就需要聲明為nonlocal變量(使用nonlocal關(guān)鍵詞伦吠,python 3.X以后添加的)妆兑。
來定義一個閉包:
```
def print_msg(msg):
#this is the outer enclosing function
def printer():
#this is the nested function
print(msg)
return printer
another_print = print_msg("hello")
another_print()
```
上面這種關(guān)聯(lián)著數(shù)據(jù)的代碼塊就是python中的閉包了。而且變量的取值會被保留毛仪,即使閉包超出了該變量的作用范圍或者外部的函數(shù)被刪除搁嗓。
二、條件
滿足什么條件才能被稱為閉包呢箱靴?
像上面的例子一樣腺逛,滿足了以下3個條件:
1、需要有一個內(nèi)嵌函數(shù)(定義在函數(shù)中的函數(shù))衡怀;
2棍矛、內(nèi)嵌函數(shù)需要引用定義在外部函數(shù)中變量;
3狈癞、內(nèi)嵌函數(shù)需要被返回茄靠;
三、場景
最常使用閉包的場景可以歸納為以下幾種:
1蝶桶、在一個類中只有非常少的方法(通常是只有一個)慨绳;
2、避免使用全局變量的時候真竖;
3脐雪、裝飾器模式中;
4恢共、提供一致的函數(shù)簽名战秋;