闭包是什么(以前都是语雀做笔记, 今天开始到CSDN啦)
# 闭包的写法: 外部函数return内部函数名称, 内部函数携带了外层的环境变量
# 如果是多重闭包的形式, 那么内层的闭包函数携带了所有外层的环境变量
# 打包带走。
# 内层函数g把外层f的局部变量a装好(其实只封装内层使用过的外层局部变量),
# 然后外层的f把g送走,
# 这样g就带着a去任何地方享用而不用受f限制了。
def get_closer(init):
# 闭包的环境变量初始化, 每个实例只会初始化一次
a=init
def add_a_1():
# 对于普通变量要使用nonlocal 声明a, 否则a会被当做未定义的局部变量
# 若a为序列, 则可以直接访问, 规则见变量作用域笔记
nonlocal a
a += 1
print(a)
# 再来一个闭包函数
def add_a_2():
nonlocal a
a += 2
print(a)
# 返回闭包的函数名 add_a:函数名,函数引用 add_a():函数调用
return add_a_1, add_a_2
#获取闭包实例, 每次调用get_closer()获取的实例都是独立的
#这是同一个get_closer()返回了两个闭包实例,所以共享环境变量
get_ans_1, get_ans_2=get_closer(1)
get_ans_1() #2 环境变量的值 a:2
get_ans_1() #3 环境变量的值 a:3
get_ans_2() #5 环境变量的值 a+=2->a=5
#获取新的独立的实例
a,b =get_closer(2)
a() #3
b() #5