外部嵌套作用域
# 外部 def fun01(): # 对于fun01而言,a是局部变量 # 对于fun02而言,a是外部嵌套变量 a = 10 # 内部 def fun02(): b = 20 # 可以访问外部变量 # print(a) # 并没有修改外部变量,而是创建了局部变量. # a = 100 # 声明外部变量 nonlocal a a = 100 fun02() print(a) fun01() # 100
闭包
1. 三要素:
-- 必须有一个内嵌函数。
-- 内嵌函数必须引用外部函数中变量。
-- 外部函数返回值必须是内嵌函数。
2. 语法
-- 定义:
def 外部函数名(参数):
外部变量
def 内部函数名(参数):
使用外部变量
return 内部函数名
-- 调用:
变量 = 外部函数名(参数)
变量(参数)
3. 定义:在一个函数内部的函数,同时内部函数又引用了外部函数的变量。
4. 本质:闭包是将内部函数和外部函数的执行环境绑定在一起的对象。
5. 优点:内部函数可以使用外部变量。
6. 缺点:外部变量一直存在于内存中,不会在调用结束后释放,占用内存。
7. 作用:实现python装饰器。
def fun01(): a = 10 def fun02(): print(a) return fun02 # re 变量 指向的是 内部函数 re = fun01()# 调用外部函数 ---> 执行完毕后,不释放栈帧. re()# 调用内部函数