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基于twisted框架编写简单聊天室
Jan 02 Python
Python元字符的用法实例解析
Jan 17 Python
python3库numpy数组属性的查看方法
Apr 17 Python
深入浅析Python中的迭代器
Jun 04 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
Pytorch之卷积层的使用详解
Dec 31 Python
在TensorFlow中屏蔽warning的方式
Feb 04 Python
Python拼接字符串的7种方式详解
Mar 19 Python
解决python父线程关闭后子线程不关闭问题
Apr 25 Python
python语言的优势是什么
Jun 17 Python
Python中的流程控制详解
Feb 18 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
Zerg兵种介绍
2020/03/14 星际争霸
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
2016/06/09 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
nodejs使用express获取get和post传值及session验证的方法
2017/11/09 NodeJs
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
JS实现的RC4加密算法示例
2018/08/16 Javascript
js实现一个简易计算器
2020/03/30 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python 简易计算器程序,代码就几行
2009/08/29 Python
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
python分析apache访问日志脚本分享
2015/02/26 Python
Python程序中设置HTTP代理
2016/11/06 Python
完美解决Python2操作中文名文件乱码的问题
2017/01/04 Python
python回调函数中使用多线程的方法
2017/12/25 Python
Python大数据之使用lxml库解析html网页文件示例
2019/11/16 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
优秀技术工人先进材料
2014/02/17 职场文书
《夏夜多美》教学反思
2014/02/17 职场文书
英文请假条
2014/04/11 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
班级心理活动总结
2014/07/04 职场文书
工程安全生产协议书
2014/11/21 职场文书
话题作文之成长
2019/12/09 职场文书