LEGB规则
命名空间:一个容器,其中包含的是映射到不同对象的名称。
作用域:定义了一个“层次”,我们从其中的命名空间中查找特定的“名称-对象”映射对。全局变量与局部变量的字典映射,可使用函数globals()和locals()
LEGB规则,表示的是Local -> Enclosed -> Global -> Built-in
问题的关键就是:如果我们没有明确地告诉Python我们要使用的是全局作用域,而是直接尝试修改变量值的话,就很容易产生UnboundLocalError。(记住,赋值操作的右半部分是先执行的)
eg:
a_var = 1
def a_func():
a_var = a_var + 1
print(a_var, '[ a_var inside a_func() ]')
print(a_var, '[ a_var outside a_func() ]')
a_func()
报错:
UnboundLocalError: local variable 'a_var' referenced before assignment
修改版:加上变量的作用域。
a_var = 1
def a_func():
global a_var
a_var = a_var + 1
print(a_var, '[ a_var inside a_func() ]')
print(a_var, '[ a_var outside a_func() ]')
a_func()
结果:
1 [ a_var outside a_func() ]
2 [ a_var inside a_func() ]
[Finished in 0.2s]
LEGB - 局部,外围,全局,内建