Python globals() locals() vars() 三个内建函数的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"

 

以上是关于Python globals() locals() vars() 三个内建函数的区别的主要内容,如果未能解决你的问题,请参考以下文章

python 中locals() 和 globals()

Python内置函数globals_locals 的使用

globals和locals的区别

Python globals() locals() vars() 三个内建函数的区别

python globals()和locals(),global和nonlocal,以及闭包

016.Python闭包函数以及locals和globals