闭包:
- 内层函数使用了外层函数的局部变量
- 外层函数吧内层函数返回出来
- 这个内层函数加做闭包函数
闭包的特点:
- 内层函数使用了外层函数的变量,
- 这个变量与内层函数发生了绑定关系,
- 延长了他的生命周期
魔法方法__ closure __, 查看闭包函数使用过的变量
1 def outer(): 2 a = 110 3 def inner(): 4 def small(): 5 nonlocal a 6 a = 1 7 return small 8 return inner 9 10 res = outer() 11 func = res() 12 func() 13 # __closure__获取闭包函数使用过的变量 14 # 返回一个元祖, 里面每一个元素是使用过的变量, 15 16 print(func.__closure__) # (<cell at 0x0000028C3ED19E28: int object at 0x0000000055AE6C10>,) 17 18 19 # cell_contents 是单元cell的一个属性, 获取保存的外部函数的变量 20 # 存放离得最近的外层函数的变量,或者最后一次nonlocal声明修改的变量, 21 # 若是外层函数的变量内层没有使用过, 将不存在这里 22 23 print(func.__closure__[0].cell_contents) # 1
保存离得最近的那个外层函数的变量
def outer(): a = 1 def inner(): a = 2 def small(): a = 3 def func(): print(a) return func return small return inner res = outer()()() # 保存离得最近的那个外层函数的变量 print(res.__closure__[0].cell_contents) # 3
保存最后一次nonlocal声明修改的变量
1 def outer(): 2 a = 1 3 def inner1(): 4 nonlocal a 5 a = 1000 6 7 def small(): 8 b = a 9 return small 10 11 def inner2(): 12 print(a) 13 return inner1, inner2 14 15 16 func1, func2 = outer() 17 func3 = func1() 18 19 # 三个内层函数都使用了a变量 20 # 由于inner1使用nonlocal声明修改, 并且执行func1()了 21 # 这三个内层函数保存的都是inner1声明修改的a变量 22 23 print(func1.__closure__[0].cell_contents) # 1000 24 print(func2.__closure__[0].cell_contents) # 1000 25 print(func3.__closure__[0].cell_contents) # 1000
测试是不是闭包:
1 def outer(): 2 a = 1 3 def inner(): 4 print(a) 5 return inner 6 7 8 res = outer() 9 10 # 判断是不是闭包函数 11 print(res.__closure__[0].cell_contents) 12 测试是不是闭包 13 内层函数.__closure__ 14 返回是一个元祖, 是闭包 15 如果是None , 就不是闭包