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 ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
python打开网页和暂停实例
Sep 30 Python
python基于multiprocessing的多进程创建方法
Jun 04 Python
Python的Django框架中设置日期和字段可选的方法
Jul 17 Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 Python
django使用xlwt导出excel文件实例代码
Feb 06 Python
python实现验证码识别功能
Jun 07 Python
python实现大转盘抽奖效果
Jan 22 Python
Django用户身份验证完成示例代码
Apr 03 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
python实现学生信息管理系统(精简版)
Nov 27 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
Apr 06 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采集相关教程之一 CURL函数库
2010/02/15 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
Express结合Webpack的全栈自动刷新
2019/05/23 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
JavaScript WeakMap使用详解
2021/02/05 Javascript
vue中h5端打开app(判断是安卓还是苹果)
2021/02/26 Vue.js
python执行get提交的方法
2015/04/29 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
Python logging模块原理解析及应用
2020/08/13 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
HTML5微信播放全屏问题的解决方法
2017/03/09 HTML / CSS
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
暑期实习鉴定
2013/12/16 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
教师业务培训方案
2014/05/01 职场文书
护士个人年终总结
2015/02/13 职场文书
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL
springboot中的pom文件 project报错问题
2022/01/18 Java/Android