Python两个内置函数 locals 和globals(学习笔记)


Posted in Python onAugust 28, 2016

Python两个内置函数——locals 和globals

这两个函数主要提供,基于字典的访问局部和全局变量的方式。
在理解这两个函数时,首先来理解一下python中的名字空间概念。Python使用叫做名字空间的东西来记录变量的轨迹。名字空间只是一个字典,它的键字就是变量名,字典的值就是那些变量的值。实际上,名字空间可以象Python的字典一样进行访问

每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字空间,任何模
块均可访问它,它存放着内置的函数和异常。

当一行代码要使用变量 x 的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:

1.局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x,Python将使用这个变量,然后停止搜索。
2.全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用这个变量然后停止搜索。
3.内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python将假设 x 是内置函数或变量。

如果Python在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 的异常,同时传递
There is no variable named 'x' 这样一条信息。

象Python中的许多事情一样,名字空间在运行时直接可以访问。特别地,局部名字空间可以通过内置的 locals 函数来访问。全局(模块级别)名字空间可以通过 globals 函数来访问

locals 介绍

>>> def test(arg):
#函数 foo 在它的局部名字空间中有两个变量:arg(它的值被传入函数),和 z(它是在函数里定义的)。
  z = 1
  print locals()
>>> test(4)
#locals 返回一个名字/值对的字典。这个字典的键字是字符串形式的变量名字,字典的值是变量的实际值。
#所以用 4 来调用 foo,会打印出包含函数两个局部变量的字典:arg (4) 和 z (1)。
{'z': 1, 'arg': 4}
>>> test('doulaixuexi')
#locals 可以用于所有类型的变量。
{'z': 1, 'arg': 'doulaixuexi'}
>>>

globals 介绍

>>> from sys import *
>>> print globals()
{'setrecursionlimit': <built-in function setrecursionlimit>, 
'dont_write_bytecode': False, 
'getfilesystemencoding': <built-in function getfilesystemencoding>, 
'long_info': sys.long_info(bits_per_digit=15, sizeof_digit=2), 
'stdout': <idlelib.rpc.RPCProxy object at 0x02110850>, 
'text': <function text at 0x02111A70>, 
'meta_path': [], 
'exc_clear': <built-in function exc_clear>, 
'prefix': 'C:\\Python27', 'getrefcount': <built-in function getrefcount

由此可见,发现globals 函数返回一个全局变量的字典,包括所有导入的变量。

#局部变量函数locals例子(locals 返回一个名字/值对的字典。):

def foo(arg, a):
	x = 1
	y = 'xxxxxx'
	for i in range(10):
		j = 1
		k = i
	print locals()


#调用函数的打印结果	
foo(1,2)
#{'a': 2, 'i': 9, 'k': 9, 'j': 1, 'arg': 1, 'y': 'xxxxxx', 'x': 1}

 

from module import 和 import module之间的不同。使用 import module,模块自身被导入,
但是它保持着自已的名字空间,这就是为什么你需要使用模块名来访问它的函数或属性(module.function)
的原因。但是使用 from module import,实际上是从另一个模块中将指定的函数和属性导入到你自己的名字
空间,这就是为什么你可以直接访问它们却不需要引用它们所来源的模块的原因。

locals 是只读的,globals 不是 

Python 相关文章推荐
Python命名空间详解
Aug 18 Python
Python性能优化技巧
Mar 09 Python
pyenv命令管理多个Python版本
Mar 26 Python
python之PyMongo使用总结
May 26 Python
Python编写Windows Service服务程序
Jan 04 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
python爬虫-模拟微博登录功能
Sep 12 Python
将python字符串转化成长表达式的函数eval实例
May 11 Python
浅谈PyTorch中in-place operation的含义
Jun 27 Python
如何利用python生成MD5并去重
Dec 07 Python
在pycharm中无法import所安装的库解决方案
May 31 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 #Python
python解决方案:WindowsError: [Error 2]
Aug 28 #Python
详解Python中的文件操作
Aug 28 #Python
Python环境变量设置方法
Aug 28 #Python
Python代码解决RenderView窗口not found问题
Aug 28 #Python
python 文件操作api(文件操作函数)
Aug 28 #Python
python之文件的读写和文件目录以及文件夹的操作实现代码
Aug 28 #Python
You might like
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
python获取文件扩展名的方法
2015/07/06 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
python实现websocket的客户端压力测试
2019/06/25 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
python实现图像外边界跟踪操作
2020/07/13 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
物业管理个人自我评价
2013/11/08 职场文书
电子商务毕业生求职信
2013/11/10 职场文书
愚人节活动策划方案
2014/03/11 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
信用卡收入证明范本
2015/06/12 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
JavaScript实现班级抽签小程序
2021/05/19 Javascript
一起来学习Python的元组和列表
2022/03/13 Python
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫
vue判断按钮是否可以点击
2022/04/09 Vue.js
Nginx利用Logrotate实现日志分割
2022/05/20 Servers