闭包

外部嵌套作用域

# 外部
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()# 调用内部函数
 
原文地址:https://www.cnblogs.com/NeverYa/p/11223612.html