python中的閉包是指一個函式內部又巢狀了一個函式,內層函式可以使用外層函式的引數和區域性變數,外層函式返回內層函式的引用。
一般來說,一個函式的實參及區域性變數,只在函式執行過程中儲存,函式執行完後就會釋放掉。 但閉包機制的這種外層函式執行完後,由於其內層函式需要用到外層的資料,所以python會將這些資料持久化儲存。相當於把內層函式,及其用到的外部變數打包在一塊放在一個封閉的空間裡,這個空間我們就稱其為閉包。
每次執行外部函式時,都會生成一個獨立的閉包,而非共享同一個儲存空間。
def outter():
data = []
def inner(value):
data.append(value)
return data
data=[0]
return inner
f = outter()
print(f(1))
print(f(2))
print(f(3))
print(f.__closure__) # 對於一個閉包,函式用到的外部資料存放在 __closure__ 中
print(hex(id(f(1)))) # 可以看出,閉包中返回的外部資料data的id與存放在__closure__中的data變數的id是相同的。
g = outter() # g與f是兩個獨立的閉包,使用各自的外部資料data
print(g(1))
print(g(2))
print(g.__closure__)
print(hex(id(g(1))))