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 01 Python
简述Python中的面向对象编程的概念
Apr 27 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
Python抓取框架 Scrapy的架构
Aug 12 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
Nov 10 Python
Python实现将多个空格换为一个空格.md的方法
Dec 20 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
python的pstuil模块使用方法总结
Jul 26 Python
pandas 如何分割字符的实现方法
Jul 29 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
Apr 01 Python
实例讲解Python 迭代器与生成器
Jul 08 Python
 分享一个Python 遇到数据库超好用的模块
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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
PHP 变量的定义方法
2010/01/26 PHP
PHP include_path设置技巧分享
2011/07/03 PHP
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
详细解析Python当中的数据类型和变量
2015/04/25 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
python实现简单银行管理系统
2019/10/25 Python
Windows下实现将Pascal VOC转化为TFRecords
2020/02/17 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
施工人员岗位职责
2013/12/12 职场文书
告诉你怎样写创业计划书
2014/01/27 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏