不喜欢多做文字解释,看代码,能懂就懂,学会百度是必备技能之一
内部函数引用外部函数变量 内部函数必须引用一个定义在闭合范围内的变量
必须返回那个内部函数
- 保存内部函数的变量
__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