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的Bottle框架中获取制定cookie的教程
Apr 24 Python
Python subprocess模块详细解读
Jan 29 Python
如何使用VSCode愉快的写Python于调试配置步骤
Apr 06 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
深入了解Django中间件及其方法
Jul 26 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
.dcm格式文件软件读取及python处理详解
Jan 16 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
500行python代码实现飞机大战
Apr 24 Python
用60行代码实现Python自动抢微信红包
Feb 04 Python
Python快速优雅的批量修改Word文档样式
May 20 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
第十五节--Zend引擎的发展
2006/11/16 PHP
php处理json时中文问题的解决方法
2011/04/12 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
JavaScript检查某个function是否是原生代码的方法
2014/08/20 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
antd form表单数据回显操作
2020/11/02 Javascript
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
在Django框架中编写Contact表单的教程
2015/07/17 Python
Python图算法实例分析
2016/08/13 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
python3 下载网络图片代码实例
2019/08/27 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
员工家属慰问信
2015/03/24 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
python pygame 开发五子棋双人对弈
2022/05/02 Python
浅谈Redis缓冲区机制
2022/06/05 Redis
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL