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实现在线程里运行scrapy的方法
Apr 07 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
python中kmeans聚类实现代码
Feb 23 Python
linux下python使用sendmail发送邮件
May 22 Python
Python 中字符串拼接的多种方法
Jul 30 Python
浅谈Python基础—判断和循环
Mar 22 Python
python BlockingScheduler定时任务及其他方式的实现
Sep 19 Python
Pytorch之Variable的用法
Dec 31 Python
Python面向对象之继承原理与用法案例分析
Dec 31 Python
Python Selenium 设置元素等待的三种方式
Mar 18 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 Python
Python利用zhdate模块实现农历日期处理
Mar 31 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采集类snoopy详细介绍(snoopy使用教程)
2014/06/19 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
javascript this详细介绍
2016/09/19 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
2016/11/12 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
Vue实现多页签组件
2021/01/14 Vue.js
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
中文系学生自荐信范文
2013/11/13 职场文书
校班主任推荐信范文
2013/12/03 职场文书
优秀高中生事迹材料
2014/02/11 职场文书
网络工程师专家职业发展路线
2014/02/14 职场文书
策划总监岗位职责
2014/02/16 职场文书
大学生个人学习总结
2015/02/15 职场文书
建国大业观后感600字
2015/06/01 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
使用pytorch实现线性回归
2021/04/11 Python
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers