首先参考官方文档对这三个函数的介绍:

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() 三个内建函数的区别的更多相关文章

  1. python实现进程的三种方式及其区别

    在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.fork() if ret == 0: # ...

  2. Python 文件读写的三种模式和区别

    #coding=utf-8 #__author:Administrator #__time:2018/5/9 13:14 #__file_name:text1 import io #能调用方法的一定是 ...

  3. python核心高级学习总结3-------python实现进程的三种方式及其区别

    python实现进程的三种方式及其区别 在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.f ...

  4. Python基础_eval(),exec(),globals(),locals(),compile()

    转发:http://www.cnblogs.com/yyds/p/6276746.html 1. eval函数 函数的作用: 计算指定表达式的值.也就是说它要执行的Python代码只能是单个运算表达式 ...

  5. Python globals和locals函数_reload函数

    Python globals和locals函数_reload函数: globals( ): 返回所有能够访问到的全局名字 num = 5 sum = 0 def add(num): func_sum ...

  6. Python 基础【第三篇】输入和输出

    这里我们创建一个python(pytest)脚本用于学习测试(以后都为这个文件,不多做解释喽),这个文件必须要有执行权限的哈 1.创建pytest并赋予执行权限 [root@fengyuba_serv ...

  7. python学习心得第三章

    python学习心得第三章 1.三元运算 变量=值1 if 条件 else 值2 由图如果条件成立则赋值1给变量,如果条件不成立则赋值2给变量. 2.数据类型 集合:set() class set(o ...

  8. 机器学习算法与Python实践之(三)支持向量机(SVM)进阶

    机器学习算法与Python实践之(三)支持向量机(SVM)进阶 机器学习算法与Python实践之(三)支持向量机(SVM)进阶 zouxy09@qq.com http://blog.csdn.net/ ...

  9. Python爬虫学习:三、爬虫的基本操作流程

    本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将 ...

随机推荐

  1. Learning How to Learn学习笔记(转)

    add by zhj: 工作中提高自己水平的最重要的一点是——快速的学习能力.这篇文章就是探讨这个问题的,掌握了快速学习能力的规律,你自然就有了快速学习能力了. 原文:Learning How to ...

  2. socketserver模块、MySQL(数据库、数据表的操作)

    一.socketserver实现并发 基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环. socketserver模块中分两大类:server类(解决链接问题)和request类(解决 ...

  3. springMvc获取特殊值

    1.获取数组

  4. Thymeleaf添加页面模板

    在页面编辑中,有一些公共的页面部分(比如header,footer等)可以抽取出来放到模板中,其他页面使用的时候可以调取该模板,这样的好处是如果修改这些公共部分,只修改模板中的代码即可. 为了做到这一 ...

  5. C#设置当前程序通过IE代理服务器上网

    注意:以下设置只在当前程序中有效,对IE浏览器无效,且关闭程序后,自动释放代码. using System; using System.Collections.Generic; using Syste ...

  6. 初识ganglia

    本文地址:http://www.cnblogs.com/qiaoyihang/ 一.Ganglia是什么?Ganglia主要用来解决什么样的问题? ganglia是一个可扩展的分布式监控系统,用于监控 ...

  7. ceph存储安装配置

    1.修改yum源: 1.安装yum源:sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://dl.fedor ...

  8. [原创] 毕设---在myeclipes中安装Hadoop开发插件

    1.安装Hadoop开发插件 hadoop安装包contrib/目录下有个插件hadoop-0.20.2-eclipse-plugin.jar,拷贝到myeclipse根目录下/dropins目录下. ...

  9. 【hihocoder】01背包

    描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要ne ...

  10. vue脚手架解决跨域问题-------配置反向代理

    1.打开config/index.js 2.在dev配置对象中找到proxyTable:{} 3.添加如下配置 // 配置反向代理,解决跨域请求 proxyTable: { '/api': { tar ...