nonlocal用来在内部函数中声明外层的局部变量
global在函数内声明全局变量,然后才能使用全局变量
a = 100
def outer():
b = 10
def inner():
nonlocal b
print("inner b:", b)
b = 20
global a
a = 1000
inner()
print("outer b:", b)
outer()
print("a:", a)
"""
运行结果:
inner b:10
outer b:20
a:1000
如果注释掉global a:
inner b:10
outer b:20
a:100
如果注释掉nonlocal b:
报错:UnboundLocalError: local variable 'b' referenced before assignment
"""
LEGB规则
Python在查找名称时,是按照LEGB规则查找的:
Local-->Enclosed-->Global-->Built in
Local指的就是函数或者类的方法内部
Enclosed指的是嵌套函数
Global指的是模块中的全局变量
Built in指的是Python为自己保留的特殊名称
s = "global"
def outer():
s = "outer"
def inner():
s = "inner"
print(s)
inner()
outer()
# 输出inner
s = "global"
def outer():
s = "outer"
def inner():
# s = "inner"
print(s)
inner()
outer()
# 输出outer
s = "global"
def outer():
# s = "outer"
def inner():
# s = "inner"
print(s)
inner()
outer()
# 输出golbal