Python with 工作原理、装饰器、回收机制、内存管理机制、拷贝、作用域等( 七 )


在默认情况下 , 变量名赋值会创建改变局部变量变量名引用至多可以在四种作用域内进行查找:首先是局部 , 其次是外层的函数 , 之后是全局 , 然后是内置使用和语句声明的名称将赋值的变量名分别映射到外围的模块和函数的作用域 , 变成全局 。
变量名解析机制称为LEGB规则 , 也是有作用域的命名而来的:
当你在函数内使用未限定的变量名时 , 将查找4个作用域并在找到该变量名的地方停下:分别是局部作用域L , 向外一层的def或的局部作用域E , 全局作用域G , 最后时内置作用域B 。如果都没有找到就会报错 。当你在函数中给一个变量名赋值时 , 会创建或改变局部作用域的变量名 , 除非该变量名已经在该函数中被声明为全局变量 。当你在所有函数的外面给一个变量名赋值时 , 就是在模块文件的顶层或时交互式命令行下 , 此时的局部作用域就是全局作用域 , 即该模块的命名空间 。
案例介绍巩固:
def show_value():temp = 1def show_value_inner():temp = 2show_value_inner()print(temp) # 1show_value()
和的作用域
关键字用来在函数或其他局部作用域中使用全局变量 。但是如果不修改全局变量也可以不使用关键字
声明全局变量 , 如果在局部要对全局变量修改 , 需要在局部也要先声明该全局变量
在局部如果不声明全局变量 , 并且不修改全局变量 。则可以正常使用全局变量
关键字用来在函数或其他作用域中使用外层(非全局)变量
global temptemp = 1def show_value():def show_value_inner():print(temp) # 1show_value_inner()print(temp) # 1show_value()
07、闭包的原理
闭包的介绍:
如果在一个函数的内部定义了另一个函数 , 外部的函数叫它外函数 , 内部的函数叫它内函数 。
闭包条件:
在一个外函数中定义了一个内函数
内函数里运用了外函数的临时变量
并且外函数的返回值是内函数的引用
一般情况下 , 如果一个函数结束 , 函数的内部所有东西都会释放掉 , 还给内存 , 局部变量都会消失 。但是闭包是一种特殊情况 , 如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到 , 就把这个临时变量绑定给了内部函数 , 然后自己再结束 。
# 闭包函数的实例# outer是外部函数 a和b都是外函数的临时变量def outer( a ):b = 10# inner是内函数def inner():#在内函数中 用到了外函数的临时变量print(a+b)# 外函数的返回值是内函数的引用return innerif __name__ == '__main__':# 在这里我们调用外函数传入参数5# 此时外函数两个临时变量 a是5 b是10  , 并创建了内函数 , 然后把内函数的引用返回存给了demo# 外函数结束的时候发现内部函数将会用到自己的临时变量 , 这两个临时变量就不会释放 , 会绑定给这个内部函数demo = outer(5)# 我们调用内部函数 , 看一看内部函数是不是能使用外部函数的临时变量# demo存了外函数的返回值 , 也就是inner函数的引用 , 这里相当于执行inner函数demo() # 15demo2 = outer(7)demo2() #17
我们可以将闭包理解为一种特殊的函数 , 这种函数由两个函数的嵌套组成 , 且称之为外函数和内函数 , 外函数返回值是内函数的引用 , 此时就构成了闭包 。