一、闭包的作用
- 保证数据安全
- 装饰器的本质
二、闭包的产生
- 嵌套函数
- 内层函数调用外层函数的非全局变量
这个过程中这些外层函数非全局变量将成为自由变量(不受其他任何函数的调用)
# 代码
def outer(a, b):
lst = []
count = 0
def inner(x):
lst.append(x)
nonlocal count
count += 1
print(a, b)
return sum(lst) / len(lst), count
return inner
ret = outer(1, 2)
print(ret(1))
print(ret(2))
print(ret(3))
# 输出
1 2
(1.0, 1)
1 2
(1.5, 2)
1 2
(2.0, 3)
outer() 中的可变数据lst、不可变数据count、位置参数a/b,都属于外层函数的非全局变量
三、判断函数是否为闭包函数——打印函数的自由变量
# 代码接上
print(ret.__code__.co_freevars)
# 输出
('a', 'b', 'count', 'lst')