Python globals() locals() vars() 三个内建函数的区别
首先参考官方文档对这三个函数的介绍:
2. Built-in Functions – Python3.5
1、globals()
返回当前全局符号表, 通常是返回当前模块下的全局符号表, 比如全局内建的函数,以及模块里的全局符号(定义声明的变量,类, 实例等), 在函数或者类方法中, globals()返回的模块符号表 是其所在模块, 而不是调用模块.
2、locals()
更新并以字典形式返回当前局部符号表. 自由变量由函数块的locals() 返回, 而不会由 class 块来返回. 需要注意的是, locals() 字典不应该被修改; 在解释器中对修改行为可能对 local 值或者自由变量无效.
3、vars()
返回 __dict__ 属性, 比如模块, 类, 实例, 或者其他 带有 __dict__ 属性的 object. 比如 模块和实例拥有可更新的 __dict__ 属性;然而其他 objects 可能会对 __dict__ 属性的写操作限制(例如 类使用 dictproxy 阻止直接对字典更新).vars() 如果不传参数, 那么作用与 locals() 一样. 需要注意的是, locals 字典只在读操作时使用, 因为对 locals 的更新会被忽略.
4、举例
#!/usr/bin/env python # -*- coding: utf-8 -*- # HELLO = 1 # GLOABLS 字典值包含 __builtins__, __doc__等通用的全局内建函数,模块, # 以及刚才定义的 HELLO GLOABLS = globals() print("outer-global-{}".format(GLOABLS)) LOCALS = locals() # 此时与 globals() 是等价的!! print("outer-locals-{}".format(LOCALS)) # globals 和 locals 此时是等价的, GLOBALS 和 LOCALS 其实是指向一个引用 LOCALS['B'] = 1 # VARS 的引用与 GLOABLS LOCALS 一样, 可用 id() 来证实. VARS = vars() class A(object): # 此时的 locals 是 class 块的 locals, 拥有 A_LOCALS A_GLOBALS 值 A_LOCALS = locals() # 与 GLOBALS 等价 A_GLOBALS = globals() def __init__(self): self.func_locals = None self.func_globals = None def func(self): self.func_locals = locals() self.func_globals = globals() # 即 GLOBALS 值 a = A() a.func() print("instance-globals-{}".format(a.A_GLOBALS)) print("instance-locals-{}".format(a.A_LOCALS)) a_vars = vars(a) # 返回实例的 __dict__, 等价于 a_vars = a.__dict__ # print(a_vars) A_DICT = vars(A) # 返回类的 dictproxy, 不能对其key直接操作赋值. print(A_DICT) a_vars['func_vars'] = "vars" #print(a.func_vars) # "vars"
生活不会突变,你要做的只是耐心和积累。人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。你的时间有限,做喜欢的事情会令人愉悦,所以跟随自己的本心。