閉包就是內層函數, 對外層函數(非全局)的變量的引⽤. 叫閉包
def func1(): name = "alex" def func2(): print(name) # 閉包 func2() func1() 結果: alex
我們可以使⽤__closure__來檢測函數是否是閉包. 使⽤函數名.__closure__返回cell就是
閉包. 返回None就不是閉包
def func1(): name = "alex" def func2(): print(name) # 閉包 func2() print(func2.__closure__) # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,) func1()
如何在函數外邊調⽤內部函數呢?
def outer(): name = "alex" # 內部函數 def inner(): print(name) return inner fn = outer() # 訪問外部函數, 獲取到內部函數的函數地址 fn() # 訪問內部函數
那如果多層嵌套呢? 很簡單, 只需要⼀層⼀層的往外層返回就⾏了
def func1(): def func2(): def func3(): print("嘿嘿") return func3 return func2 func1()()()
由它我們可以引出閉包的好處. 由於我們在外界可以訪問內部函數. 那這個時候內部函
數訪問的時間和時機就不⼀定了, 因為在外部, 我可以選擇在任意的時間去訪問內部函數. 這
個時候. 想⼀想. 我們之前說過, 如果⼀個函數執⾏完畢. 則這個函數中的變量以及局部命名
空間中的內容都將會被銷毀. 在閉包中. 如果變量被銷毀了. 那內部函數將不能正常執⾏. 所
以. python規定. 如果你在內部函數中訪問了外層函數中的變量. 那么這個變量將不會消亡.
將會常駐在內存中. 也就是說. 使⽤閉包, 可以保證外層函數中的變量在內存中常駐. 這樣做
有什么好處呢? 非常⼤的好處. 我們來看⼀個關於爬⾍的代碼:
from urllib.request import urlopen def but(): content = urlopen("http://www.xiaohua100.cn/index.html").read() def get_content(): return content return get_content fn = but() # 這個時候就開始加載校花100的內容 # 后⾯需要⽤到這⾥⾯的內容就不需要在執⾏⾮常耗時的⽹絡連接操作了 content = fn() # 獲取內容 print(content) content2 = fn() # 重新獲取內容 print(content2)
綜上, 閉包的作⽤就是讓⼀個變量能夠常駐內存. 供后⾯的程序使⽤.