LEGB规则:变量同名情况下的优先级
Local -> Enclosed -> Global -> Built-in,
其中的箭头方向表示的是搜索顺序。
Local 在一个函数或者类方法内部。
Enclosed 嵌套在函数内,比如, 一个函数包裹在另一个函数内部。
Global 代表的是执行脚本自身的最高层次。
Built-in 是Python为自身保留的特殊名称。
如果某个name:object映射在局部(local)命名空间中没有找到,就会在闭包作用域(enclosed)进行搜索;
如果闭包作用域也没有找到,Python就会到全局(global)命名空间中进行查找;
最后会在内建(built-in)命名空间搜索
(注:如果一个名称在所有命名空间中都没有找到,就会产生一个NameError)。
例1:内外变量同名,则 局部变量 优于 全局变量 ( LEGB:L 优先于 G)
a = 'global variable' #定义了一个global 变量
def f():
a='local variable' #定义了一个local 变量
print(a) # LEGB : L 优于 G
f()

例2:有了赋值号 = ,在赋值号的右边出现变量名,造成“定义前,就开始使用”的错误
a = 1
def f():
a = a + 2 # 错误语句! 右面的a是本地变量,还没有定义,竟然被引用啦?
print(a)
f()

例3:在函数内部,声明全局变量
a = 1
def f():
global a # 没有这句,下一行就成为错误语句
a = a + 2 # 修改了全局变量a的值,没有产生局部变量
print(a) # 函数内部的打印
f()
print(a) # 函数外部的打印
结果:
3
3
例4:L E G
a_var = 'global value' # G
def outer():
a_var = 'enclosed value' # E
def inner():
a_var = 'local value' # L
print(a_var) # L 优先
inner()
outer()

例5: E G
a_var = 'global value'
def outer():
a_var = 'enclosed value'
def inner():
print(a_var) # E 优先于 G
inner()
outer()

例6:L E G
nonlocal 表示:不再定义新变量,而是在最近的前面出现的变量
a_var = 'global value'
def outer():
a_var = 'local value'
print('outer before:', a_var)
def inner():
nonlocal a_var # 下一行将修改这个变量的值,而不是新建变量
a_var = 'inner value' # 把变量值,由'local value' 改为'inner value'
print('in inner():', a_var)
inner()
print("outer after:", a_var)
outer()

这里,只定义了2个变量,而不是3个
例7:LEGB 中的 G B
a_var = 'global variable'
def len(in_var): # 自建 len() 级别高于 内建 len() ,属于 G (G 高于 B )
print('called my len() function')
l = 0
for i in in_var:
l += 1
return l
def a_func(in_var):
len_in_var = len(in_var) # 首先调用自建的 len()
print('Input variable is of length', len_in_var)
a_func('Hello, World!')

作业:判断下面的结果:
def myfunc(): global x x=100 myfunc() print(x)

