• 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"
  • 相关阅读:
    leetcode 14. 最长公共前缀
    leetcode13. 罗马数字转整数
    leetcode 21.合并两个有序链表
    leetcode14-最长公共前缀
    leetcode13-罗马数字转整数
    leetcode11- 盛最多水的容器
    leetcode9-回文数
    leetcode7- 整数反转
    leetcode 1-两数之和
    文件的上传
  • 原文地址:https://www.cnblogs.com/wanstack/p/7286328.html
Copyright © 2020-2023  润新知