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 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
Python中实现常量(Const)功能
Jan 28 Python
Python编写生成验证码的脚本的教程
May 04 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
python pycurl验证basic和digest认证的方法
May 02 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
python 求一个列表中所有元素的乘积实例
Jun 11 Python
python tkinter控件布局项目实例
Nov 04 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
python 弧度与角度互转实例
Apr 15 Python
python numpy中setdiff1d的用法说明
Apr 22 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 函数学习简单小结
2010/07/08 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
python for 循环获取index索引的方法
2019/02/01 Python
pandas删除指定行详解
2019/04/04 Python
Django 用户认证组件使用详解
2019/07/23 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
python opencv实现简易画图板
2020/08/27 Python
python能做哪些生活有趣的事情
2020/09/09 Python
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
小程序canvas中文字设置居中锚点
2019/04/16 HTML / CSS
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
电子专业推荐信范文
2013/11/18 职场文书
公司出纳岗位职责
2013/12/07 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书