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语法快速入门指南
Oct 12 Python
Python数据分析之如何利用pandas查询数据示例代码
Sep 01 Python
Python中的单继承与多继承实例分析
May 10 Python
学生信息管理系统Python面向对象版
Jan 30 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
django和vue实现数据交互的方法
Aug 21 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
python:目标检测模型预测准确度计算方式(基于IoU)
Jan 18 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
PyCharm永久激活方式(推荐)
Sep 22 Python
pandas apply多线程实现代码
Aug 17 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 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
PHP中的正则表达式函数介绍
2012/02/27 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
Javascript面向对象编程
2012/03/18 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
loading动画特效小结
2017/01/22 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
浅入深出Vue之组件使用
2019/07/11 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
python基础教程之Filter使用方法
2017/01/17 Python
transform python环境快速配置方法
2018/09/27 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
Python各种扩展名区别点整理
2020/02/27 Python
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
2014年最新离婚协议书范本
2014/10/11 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
追悼会家属答谢词
2015/09/29 职场文书
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL