1.python作用域分4种情况:
L:local,局部作用域,即函数中定义的变量;
E:enclosing,嵌套的父集函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
G:globa,全局变量,就是模块级别定义的变量;
B:built-in,系统固定模块里面的变量,比如int,bytearray等。搜索变量的优先级顺序依次是:作用
域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。
注:局部作用域不能修改全局变量
count=10
def con():
print(count)
counr=5 #会报错,把print输出注释掉就可以运行
con()
2.局部变量修改为全局变量要加globa
count=10
def con():
global count #声明此变量为全局变量
print(count)
count=5
print(count)
con()
3.嵌套函数中全局变量用nonlocal
def con():
count = 10
def oute():
nonlocal count
count=5
print(count)
oute()
print(count)
con()
4.小结
(1)变量查找顺序,LEGB,作用域局部>外层作用域>当前模块中的全局>python内置作用域;
(2)只有模块,类,及函数才能引入新作用域;
(3)对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部
作用域的变量;
(4)内部作用域要修改外部作用域变量的值时,全局变量要使用global关键字,嵌套作用域
变量要使用nonlocal关键字。nonlocal是python3新增的关键字,有了这个关键字,就
能完美实现闭包。