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快速排序代码实例
Nov 21 Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 Python
浅谈python为什么不需要三目运算符和switch
Jun 17 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
对Python中DataFrame按照行遍历的方法
Apr 08 Python
对Python中list的倒序索引和切片实例讲解
Nov 15 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
Jul 21 Python
python安装cx_Oracle和wxPython的方法
Sep 14 Python
Python基于execjs运行js过程解析
Nov 27 Python
python3 实现mysql数据库连接池的示例代码
Apr 17 Python
使用pandas模块实现数据的标准化操作
May 14 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统计字符串中中英文字符的个数
2013/06/23 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
twig里使用js变量的方法
2016/02/05 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
vue-loader教程介绍
2017/06/14 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
js注册时输入合法性验证方法
2017/10/21 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
React优化子组件render的使用
2019/05/12 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
[01:52]PWL S2开团时刻第四期——DOTA2成语故事
2020/12/03 DOTA
学习python处理python编码问题
2011/03/13 Python
使用Protocol Buffers的C语言拓展提速Python程序的示例
2015/04/16 Python
使用Python写个小监控
2016/01/27 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
python3爬虫之设计签名小程序
2018/06/19 Python
python爬取哈尔滨天气信息
2018/07/14 Python
广告业务员岗位职责
2014/02/06 职场文书
2014年小学元旦活动方案
2014/02/12 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
小学新课改心得体会
2016/01/22 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
mysql如何查询连续记录
2022/05/11 MySQL