globals()获取module级变量, locals()获取局部变量,均以dict形式返回。
python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 。
所以本地作用域是可以访问到globals()里的变量的,但不能直接修改全局变量,因为python赋值实际上相当于本地作用域声明了一个变量。如果想直接修改全局变量,可以使用global修饰符。
其实python关于局部变量的逻辑与静态语言是一致的,如果某一变量在本地作用域有声明的话,则访问/修改的是本地变量,如果没有声明则访问/修改全局变量。
所不同的是,python变量的声明是隐式的,所以赋值会声明一个变量,对外表现则是不能直接修改全局变量。
var = 'global'
def test_local():
# global var
var = 'local'
print var # local
print locals() # {'var': 'local'}
print globals() # {'var': 'global'} 省去了其他不相关变量
test_local()
print var # global