內部函數引用外部函數變量 內部函數必須引用一個定義在閉合範圍內的變量
必須返回那個內部函數
- 保存內部函數的變量
__closure__
屬性,這個屬性非常的特別,它可以保存函數內部的變量,不會被外部修改,從而保證了數據的安全性
def fun(): x = 5 def interior(): nonlocal x x += 1 return x return interior a = fun_out() a() # 調用a
這是一個簡單的閉包,怎麼才能通過程序來知道它和普通的函數有什麼區別呢
可以通過使用Python內建的 __closure__ 方法來測試
a.__closure__
(<cell at 0x000001B6333AAFA8: int object at 0x00000000516461E0>,)
如果是一個普通函數呢
In [39]: def a():
...: print("1")
In [40]: a
Out[40]: <function __main__.a>
In [41]: a()
1
In [42]: a.__closure__
In [43]: type(a.__closure__)
Out[43]: NoneType # 這是一個空類型
閉包可以確保變量安全性
普通函數的寫法
_list = []
for i in range(3):
def func(a):
return i + a
_list.append(func)
for f in _list:
print(f(1))
# 這是一個普通函數,執行結果是3,3,3
原因在於:Python中循環體內定義函數,在循環執行過程當中無法保存不停改變的變量
接下來我們用閉包來實現一下看一下結果
_list = [] # 定義一個list
for i in range(3):
def func_out(a):
def func_in(z):
return a + z
return func_in
_list.append(func_out(i)) # for循環持續往列表中添加並且調用func_out
for f in _list:
print(f(1)) # for循環持續往列表中添加並且調用func_in