网站制作客户寻找,西安 北郊网站建设,网站建设安排总结,厦门做网站seoPython之函数进阶-nonlocal和LEGB
nonlocal语句
nonlocal:将变量标记为不在本地作用域定义#xff0c;而是在上级的某一级局部作用域中定义#xff0c;但不能是全局作用域中定义。
函数的销毁
定义一个函数就是生成一个函数对象#xff0c;函数名指向的就是函数对象。可…Python之函数进阶-nonlocal和LEGB
nonlocal语句
nonlocal:将变量标记为不在本地作用域定义而是在上级的某一级局部作用域中定义但不能是全局作用域中定义。
函数的销毁
定义一个函数就是生成一个函数对象函数名指向的就是函数对象。可以使用del语句删除函数使其引用计数减1。可以使用同名标识符覆盖原有定义本质上也是使其引用计数减1。Python程序结束时所有对象销毁。函数也是对象也不例外是否销毁还是看引用计数是否减为0。
变量名解析原则LEGB
Local本地作用域、局部作用域的local命名空间。函数调用时创建调用结束消亡EnclosingPython2.2时引入了嵌套函数实现了闭包这个就是嵌套函数的外部函数的命名空间Global全局作用域即一个模块的命名空间。模块被import时创建解释器退出时消亡Build-in内置模块的命名空间生命周期从python解释器启动时创建到解释器退出时消亡。例如 print(open)print和open都是内置的变量
图一LEGB def inc():c 0def inner():c 1return creturn innerf inc()
print(1, f())
print(2, f())# 报错原因inner中c 操作是inner函数中的c因为没有定义inner中的c变量所以不能用。
# 报错内容UnboundLocalError: cannot access local variable c where it is not associated with a valuedef inc():c 0 # 自由变量局部变量def inner():global cc 1return creturn innerf inc()
print(1, f())
print(2, f())# 报错原因inner定义了global c但是python全局中没有c变量
# 报错内容NameError: name c is not defineddef inc():global cc 0 # 自由变量局部变量def inner():global cc 1return creturn innerf inc()
print(1, f())
print(2, f())# inc中和inner中都必须定义global才能使用
# 返回结果1 1
# 返回结果2 2c# 返回结果2del c# 删除变量cdef inc():c 0 # 自由变量局部变量def inner():nonlocal c # nonlocal c表示不是inner的c那就是inc的c c 1 # 闭包在c 1这里因为这个c不是inner的是它上一层inc的c所以需要闭包return creturn innerf inc()
print(1, f())
print(2, f())# 返回结果1 1
# 返回结果2 2def a():nonlocal cc 100
print(a())# 报错原因nonlocal c不是本函数的c只能向上一层函数找但是在上一层就是global了nonlocal不允许在global中使用。
# 报错内容SyntaxError: no binding for nonlocal c founddef inc():a 1000 c 0def inner():nonlocal cc 1return creturn innerf inc()
print(1, f())
print(2, f())# 此代码主要说明a没有闭包因为在嵌套函数inner中没有使用到adef inc():a 1000 c 0def inner():nonlocal cc 1return cdef t():nonlocal aprint(a)print(t.__closure__)return innerreturn tf inc()
print(1, f())
print(2, f())# 此代码中a和c都用到了闭包因为函数inner用了c函数t用了ac 0
def a():c 1def b():c 2def c():c 3print(c)# 闭包遵循就近原则此代码为例如函数c的c变量注释掉打印的c就是函数中的c以此类推。