在函式嵌套的前提下,內部函式參考了外部函式的變數,并且外部函式回傳(return)了內部函式,即外部函式回傳了參考了外部函式變數的內部函式,這時我們稱內部函式為閉包,
比如說如下例子:
# 外部函式
def func_outer(a):
# 內部函式
def func_inner(b):
c = a + b
return c
return func_inner
# 創建閉包實體
f = func_outer(1)
# 執行閉包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)
在這里,f就叫做閉包的實體,func_inner函式就叫做閉包
此時執行結果如下:

可以見得,f里封存了外部函式的變數1,當閉包實體建立出來,再實行閉包實體,此時相當于1+2和1+3,得到了如上結果,
使用debug可以查看到,執行完f = func_outer(1)代碼后,此時一個函式物件已經保存在記憶體當中:

當一開始步入代碼num1 = f(2)(實行閉包)后:

一個外部函式.內部函式的物件存盤在了記憶體中,注意:在執行完f = func_outer(1)并沒有立即產生這樣一個物件,而是在呼叫時才會產生該物件
這時,再步入內部函式:


這樣c=3便出現了,此時在列印c就會出現3,4的出現與3的原理一樣
修改外部函式的變數
代碼如下:
# 外部函式
def func_outer(a):
# 內部函式
def func_inner(b):
nonlocal a
a = 2
c = a + b
return c
return func_inner
# 創建閉包實體
f = func_outer(1)
# 執行閉包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)
多了一行nonlocal a 這里的nonlocal關鍵字是宣告我這里用的是外部的a,而不是自己新定義的區域變數a
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/205958.html
標籤:其他
