更新時間:2022-09-01 來源:黑馬程序員 瀏覽量:
我們都知道,Python函數(shù)是支持嵌套的。如果在一個內(nèi)部函數(shù)中對外部函數(shù)作用域(非全局作用域)的變量進(jìn)行引用,那么內(nèi)部函數(shù)就會被稱為閉包。閉包需要滿足如下三個條件:
(1)存在于嵌套關(guān)系的函數(shù)中。
(2)嵌套的內(nèi)部函數(shù)引用了外部函數(shù)的變量。
(3)嵌套的外部函數(shù)會將內(nèi)部函數(shù)名作為返回值返回。
為了讓讀者更好地認(rèn)識閉包,接下來,通過一個案例進(jìn)行講解,如例7-1所示。
例7-1 閉包.py
# 外部函數(shù) def outer(start=0): count = [start] # 函數(shù)內(nèi)的變量 # 內(nèi)部函數(shù) def inner(): count[0] += 1 # 引用外部函數(shù)的變量 return count[0] # 返回內(nèi)部函數(shù)的名稱 return inner quote = outer(5) print(quote())
在例7-1中,第2~9行代碼定義了一個嵌套函數(shù)。其中,outer函數(shù)是外部函數(shù),,inner是內(nèi)部函數(shù)。
在outer函數(shù)中,首先定義了一個表示列表的變量count(該列表只有一個元素),然后定義了一個inner函數(shù),最后將inner函數(shù)的名稱返回。
在inner函數(shù)中,引用了外部函數(shù)定義的列表count,并對count的元素進(jìn)行修改,修改后的列表元素使用return返回。
第10行代碼調(diào)用了外部函數(shù)outer,并將其返回的結(jié)果inner賦值給變量quote,這表明quote與inner一樣,引用的都是inner函數(shù)占用的內(nèi)存空間。
第11行代碼調(diào)用了quote函數(shù),實(shí)際上就是調(diào)用inner函數(shù)。
程序的運(yùn)行結(jié)果如圖7-1所示。
圖7-1 運(yùn)行結(jié)果