# 封闭,保证数据安全
# 方案一:数据不安全
# l1 = []
# def make_averger(new_value):
# l1.append(new_value)
# total = sum(l1)
# return total / len(l1)
# print(make_averger(10000))
# print(make_averger(20000))
# 方案二:数据安全,l1不能是全局变量
# 每次执行的时候l1列表都会重新赋值成空列表
# def make_averger(new_value):
# l1 = []
# l1.append(new_value)
# total = sum(l1)
# return total / len(l1)
# print(make_averger(10000))
# print(make_averger(20000))
# 方案二:数据安全,l1不能是全局变量
# 闭包只能存在嵌套的函数中
# 内层函数对外层函数非全局变量的引用(使用),就会形成闭包。
# 被引用的非全局变量也称为自由变量,这个自由变量会与内层函数产生一个绑定关系,
# 自由变量不会在内存中消失。
# 闭包的作用:保证数据安全
# def make_averger():
# l1 = []
# def averger(new_value):
# l1.append(new_value)
# total = sum(l1)
# return total / len(l1)
# return averger
# avg = make_averger()
# print(avg(10000))
# print(avg(20000))
# 如何判断一个嵌套函数是不是闭包
# def inner():
# print(a)
# print(b)
# return inner
# a = 2
# b = 3
# ret = wrapper(a,b)
# print(ret.__code__.co_freevars) # ('a', 'b')