额,我的拖延症(⊙﹏⊙)b,继续
2.闭包
python中一切都是对象,那么,参数和返回值都可以为函数
def func():
class_num = 5
def inner():
age = 20
print(class_num,age)
return inner
执行func()函数时,返回值是一个函数,那么如果想获取inner函数的结果,理论上如下方法执行
>>> a = func()
>>> a()
这时发现了奇怪的问题,诶?执行a()时,相当于执行一个独立的inner()函数,
inner内不含有变量class_num,class_num也不是全局变量.
根据python的运行机制,当a=func()之后,a获得了返回值,理论上这时函数func()已经结束,变量class_num已销毁.
执行inner()即a()时,和下面单独inner()函数执行一样,应无法获取到变量class_num,结果导致报错,例如这样:
def inner():
age = 20
print(class_num,age)
>>> inner()
NameError: name 'class_num' is not defined
但实际上并没有报错,执行结果是正确的,a()成功取到了已销毁的父级局部变量class_num
>>> a = func()
>>> print(a)
<function func.<locals>.inner at 0x7f08e00f3b70>
>>>a()
5 20
那么再实验下
添加一个全局变量class_num,发现内部inner并没有受到影响,inner()取得的变量class_num值仍是父级的局部作用域中的class_num
>>> class_num = 6
>>> a()
5 20
结论:
a()执行时,相当于执行func()函数的内部函数inner().
inner()在作为一个值返回时,包含了它的上级局部作用域,
即,内部函数的局部作用域中可以访问外部函数局部作用域,
也就是LEGB中的E级,嵌套的父级函数的局部作用域
类似的这种情况,就是闭包.