python中的作用域分4种情况
L:local,局部作用域,即函数中定义的变量;
E:enclosing, 嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
G:global,全局变量,就是模块级别定义的变量;
B:built-in, 系统固定模块里面的变量,比如int,bytearray等。搜索变量的优先级顺序是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。例如
1 x = int(2.9) # int built-in 2 g_count = 0 # global 3 o_count = 4 4 def outer(): 5 o_count = 1 # enclosing 父子局部作用 6 def inner(): 7 i_count = 2 # local 本地作用 8 print(o_count) # 从里到外找 9 print(i_count) 10 inner() 11 outer() 12 输出: 13 1 14 2
#####在局部作用域里面不能修改全局变量
在函数中引入全局变量就不能对全局变量进行修改 错误实例
1 count = 10 2 def test(): 3 print(count) # 报错 4 count = 2 # print已经引入count变量,就不能重新进行赋值 5 def test1(): 6 count = 3 # 表示在局部变量中进行重新定义。所以不报错 7 输出: 8 1 9 2
想修改全局变量,只需加上global
修改上一级的变量使用nonlocal