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实现进程的三种方式及其区别
在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.fork() if ret == 0: # ...
- Python 文件读写的三种模式和区别
#coding=utf-8 #__author:Administrator #__time:2018/5/9 13:14 #__file_name:text1 import io #能调用方法的一定是 ...
- python核心高级学习总结3-------python实现进程的三种方式及其区别
python实现进程的三种方式及其区别 在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.f ...
- Python基础_eval(),exec(),globals(),locals(),compile()
转发:http://www.cnblogs.com/yyds/p/6276746.html 1. eval函数 函数的作用: 计算指定表达式的值.也就是说它要执行的Python代码只能是单个运算表达式 ...
- Python globals和locals函数_reload函数
Python globals和locals函数_reload函数: globals( ): 返回所有能够访问到的全局名字 num = 5 sum = 0 def add(num): func_sum ...
- Python 基础【第三篇】输入和输出
这里我们创建一个python(pytest)脚本用于学习测试(以后都为这个文件,不多做解释喽),这个文件必须要有执行权限的哈 1.创建pytest并赋予执行权限 [root@fengyuba_serv ...
- python学习心得第三章
python学习心得第三章 1.三元运算 变量=值1 if 条件 else 值2 由图如果条件成立则赋值1给变量,如果条件不成立则赋值2给变量. 2.数据类型 集合:set() class set(o ...
- 机器学习算法与Python实践之(三)支持向量机(SVM)进阶
机器学习算法与Python实践之(三)支持向量机(SVM)进阶 机器学习算法与Python实践之(三)支持向量机(SVM)进阶 zouxy09@qq.com http://blog.csdn.net/ ...
- Python爬虫学习:三、爬虫的基本操作流程
本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将 ...
随机推荐
- Docker libnetwork(CNM)设计简介
The Container Network Model CNM由以下三个组件构成:Sandbox,Endpoint以及Network Sandbox 一个Sandbox包含了一个容器网络栈的配置.其中 ...
- 我的Android进阶之旅------>Android Studio使用statistics插件统计项目代码总行数
今天公司说要统计一下项目总共了多少行代码,于是上网看了一下使用statistic插件可以统计代码总行数,下面给大家分享一下 ! 1.下载[statistic]插件 首先当然要把名为[statistic ...
- 002-主流区块链技术特点及Hyperledger Fabric V0.6版本特点
一.主流区块链技术特点 二.HyperLedger子项目 三.Hyperledger fabric架构 V0.6逻辑架构: V0.6区块链网络 对应的0.6版本的运行时架构: 0.6版本的架构特点是: ...
- HDU1069:Monkey and Banana(最长上升子序列的应用)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1069 这题挺简单的,给定一个箱子的长宽高,要求啰箱子,但必须保证下面箱子的长和宽必须大于上面的箱子. 一个 ...
- 浅谈WebService SOAP、Restful、HTTP(post/get)请求
http://www.itnose.net/detail/6189456.html 浅谈WebService SOAP.Restful.HTTP(post/get)请求 2015-01-09 19:2 ...
- Java并发(6):concurrent包中的Copy-On-Write容器
一. concurrent包介绍 在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java ...
- java zookeeper权限控制ACL(digest,IP)
java zookeeper权限控制ACL(auth,digest,ip) 学习前请参考:https://www.cnblogs.com/zwcry/p/10407806.html zookeeper ...
- mysql行列互相转换
列转行: mysql> select * from test; +------+----------+-------+ | id | subject | score | +------+---- ...
- [LeetCode] 139 Word Break(BFS统计层数的方法)
原题地址: https://leetcode.com/problems/word-break/description/ 题目: Given a non-empty string s and a dic ...
- Servlet+MyBatis项目转Spring Cloud微服务,多数据源配置修改建议
一.项目需求 在开发过程中,由于技术的不断迭代,为了提高开发效率,需要对原有项目的架构做出相应的调整. 二.存在的问题 为了不影响项目进度,架构调整初期只是把项目做了简单的maven管理,引入spri ...