(a)locals
(b)globals
这里还须要在补充2个关键字一块儿比较学习,关键字:
(c)nonlocal
(d)globalpython
locals: 打印当前可用的变量的字典
globals: 返回一个描述当前全局变量的字典函数
提示:locals 是获取当前的可用变量,而 globals 是获取全局的变量学习
在使用 locals() 和 globals() 会出现如下三种表现形式:spa
(1)当locals 和 globals 都在全局做用域的时候,获取的可用环境变量是一致的blog
print(globals() == locals()) print(locals()) print(globals()) # 执行结果: # True # {'__cached__': None, '__doc__': None, ......} # {'__cached__': None, '__doc__': None, ......}
分析:
locals 和 globals 都在全局做用域中时,两者获取到的变量是一致的。作用域
(2)当 locals 在局部做用域中,而 globals 在全局做用域中io
def func(): name = 'jay' print(locals()) func() print(globals()) print('name' in globals()) # 执行结果: # {'name': 'jay'} # {'__file__': 'E:/learn_python/day15-1/test4.py', '__name__': '__main__', 'func': <function func at 0x0000019865D57268>} # False
分析:
当 locals 在局部做用域中,而 globals 在全局做用域中时:
locals 获取的仅仅是当前局部做用域中的变量,例如:{'name': 'jay'};
globals 依然是获取全局变量;
全局变量没法获取局部做用域中的变量,反之亦然,两者是相互独立的,可是全局变量能够获取在全局定义的函数、类、变量等;function
(3)locals 和 globals 都在局部做用域中class
def func(): name = 'jay' age = 20 print(locals()) print(globals()) print('name' in globals()) func() # 执行结果: # {'age': 20, 'name': 'jay'} # {'func': <function func at 0x0000024665227268>, '__name__': '__main__'......} # False
分析:
locals 和 globals 都在局部做用域中
locals 获取的仅仅是当前局部做用域中的变量,例如:{'name': 'jay'};
globals 依然是获取全局变量;
全局变量没法获取局部做用域中的变量,反之亦然,两者是相互独立的,可是全局变量能够获取在全局定义的函数、类、变量等;test
总结:
locals 和 globals 内置函数
locals 是获取当前环境可用的变量,若是 locals 在全局做用域中调用,获取的就是全局做用域中的变量,若是在局部做用域中调用,获取的就是局部做用域中的变量
globals 是获取全局环境中可用的变量,不管 globals是在全局中仍是在局部中调用,获取到的必定是全局做用域中的变量,且 globals 和 locals 是相互独立的存在
接下来,在分析下 nonlocal 和 global 的使用
要记住在 python 中引用变量的顺序:
当前做用域局部变量 --> 外层做用域变量 --> 当前模块中的全局变量 --> python内置变量
global关键字用来在函数或者其余局部做用域中使用全局变量,可是若是不修改全局变量是能够不实用global关键字
(1)仅仅只是查看使用全局变量,不作任何修改
name = 'hkey' def func(): print('局部变量 name:', name) # 根据pyton引用变量的顺序,在全局做用域中找到了 name 变量 func() print('全局变量 name:', name) # 执行结果: # 局部变量 name: hkey # 全局变量 name: hkey
(2)获取全局变量,并修改全局变量
name = 'hkey' def func(): global name # 经过 global 关键字获取全局变量 name name = 'jay' # 由于上面有 global 获取换全局变量 name 全部这里对全局变量 name 进行操做 func() print('name:', name) # 执行结果: # name: jay
(3)全局变量和局部变量同名的表现形式
name = 'hkey' def func(): name = 'jay' # 在局部做用域中直接定义了 name 变量,所以在局部获取 name 变量的时候,根据引用顺序,直接就从局部获取 print('局部变量 name: ', name) func() print('全局变量 name:', name) # 全局变量未更改 # 执行结果: # 局部变量 name: jay # 全局变量 name: hkey
global 总结:
global 是用来在局部做用域中引用python全局变量的
a. 当局部仅仅只是查看使用,可直接调用全局中的变量
b. 当局部须要修改全局变量,则须要使用 global 来获取全局变量
c. 定义局部变量的时候,应该尽可能变量和全局变量重名
nonlocal关键字用来在函数或其余做用域中使用外层(非全局)变量,nonlocal是没法获取全局变量的
(1)仅仅只是查看使用外层(非全局)变量,不作任何修改
def func(): name = 'hkey' def foo(): print('函数foo 局部变量 name:', name) # 根据 python 引用变量的原则,不修改变量时能够直接获取 return foo f = func() f() # 执行结果: # 函数foo 局部变量 name: hkey
(2)获取外层(非全局)变量,并修改外层(非全局)变量
def func(): name = 'hkey' def foo(): nonlocal name # 使用 nonlocal 关键字,获取外层(非全局)变量 name = 'jay' # 修改外层(非全局)变量 print('函数foo 局部变量 name:', name) return foo f = func() f() # 执行结果: # 函数foo 局部变量 name: jay
nonlocal 总结:
仅仅只能获取外层(非全局)变量,获取全局变量会报错
globals() 和 locals(): (1)两者都是 python 内置函数 (2)globals 不管在全局仍是局部都是用来获取全局变量的,而 locals 会随着做用域的不一样获取不一样做用域的变量global 和 nonlocal 是 python 内部关键字, global 是用来在局部做用域获取全局变量的 nonlocal 是用来在局部获取外层(非全局)变量,两者是不一样的。