Python内置函数locals和globals对比


Posted in Python onApril 28, 2020

这两个函数主要提供,基于字典的访问局部和全局变量的方式。在理解这两个函数时,首先来理解一下python中的名字空间概念。Python使用叫做名字空间的东西来记录变量的轨迹。名字空间只是一个字典,它的键字就是变量名,字典的值就是那些变量的值。实际上,名字空间可以象Python的字典一样进行访问

每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字空间,任何模块均可访问它,它存放着内置的函数和异常。

当一行代码要使用变量 x 的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:

1.局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x,Python将使用这个变量,然后停止搜索。

2.全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用这个变量然后停止搜索。

3.内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python将假设 x 是内置函数或变量。

如果Python在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 的异常,同时传递There is no variable named 'x' 这样一条信息。

#局部变量函数locals例子(locals 返回一个名字/值对的字典。):

def foo(arg, a):
    x = 1
    y = 'xxxxxx'
    for i in range(10):
        j = 1
        k = i
    print(locals())
#调用函数的打印结果
foo(1,2)
[python@master test]$ python3 f.py 
{'arg': 1, 'a': 2, 'x': 1, 'y': 'xxxxxx', 'i': 9, 'j': 1, 'k': 9}

locals 是只读的,不可修改, 而globals可以修改,原因是:

locals()实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行修改,修改的是拷贝,而对实际的局部名字空间中的变量值并无影响。

globals()返回的是实际的全局名字空间,而不是一个拷贝: 与 locals 的行为完全相反。

所以对 globals 所返回的 dictionary 的任何的改动都会直接影响到全局变量的取值。

#coding:utf-8  
'''This is my first python program!'''  
z = 7 #定义全局变量 
def foo(arg):  
  x = 1  
  print(locals()) 
  print ('x=',x) 
  locals()['x'] = 2 #修改的是局部名字空间的拷贝,而实际的局部名字空间中的变量值并无影响。 
  print(locals()) 
  print("x=",x)
 
foo(3)  
print(globals()) 
print('z=',z) 
globals()["z"] = 8 #globals()返回的是实际的全局名字空间,修改变量z的值 
print(globals()) 
print("z=",z) 
[python@master test]$ python3 h.py 
{'arg': 3, 'x': 1}
x= 1
{'arg': 3, 'x': 1}
x= 1
{'__name__': '__main__', '__doc__': 'This is my first python program!', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fb2f23db400>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'h.py', '__cached__': None, 'z': 7, 'foo': <function foo at 0x7fb2f245d1e0>}
z= 7
{'__name__': '__main__', '__doc__': 'This is my first python program!', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fb2f23db400>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'h.py', '__cached__': None, 'z': 8, 'foo': <function foo at 0x7fb2f245d1e0>}
z= 8

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中处理时间的几种方法小结
Apr 09 Python
详解Swift中属性的声明与作用
Jun 30 Python
python网络编程调用recv函数完整接收数据的三种方法
Mar 31 Python
wxPython的安装图文教程(Windows)
Dec 28 Python
python中的随机函数random的用法示例
Jan 27 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
NumPy中的维度Axis详解
Nov 26 Python
python 类之间的参数传递方式
Dec 20 Python
Tensorflow之梯度裁剪的实现示例
Mar 08 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 Python
python数字图像处理数据类型及颜色空间转换
Jun 28 Python
使用python实现CGI环境搭建过程解析
Apr 28 #Python
基于python连接oracle导并出数据文件
Apr 28 #Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 #Python
简单了解python shutil模块原理及使用方法
Apr 28 #Python
python脚本监控logstash进程并邮件告警实例
Apr 28 #Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 #Python
全网首秀之Pycharm十大实用技巧(推荐)
Apr 27 #Python
You might like
调整PHP的性能
2013/10/30 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
php实现网页端验证码功能
2017/07/11 PHP
javascript奇异的arguments分析
2010/10/20 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
javascript操作css属性
2013/12/30 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
jQuery基础知识小结
2014/12/22 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
2016/06/14 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
python利用beautifulSoup实现爬虫
2014/09/29 Python
对pandas处理json数据的方法详解
2019/02/08 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
学生请假条格式
2014/04/11 职场文书
法学专业求职信范文
2015/03/19 职场文书
圣诞晚会主持词
2015/07/01 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python