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 20 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
Python高级用法总结
May 26 Python
Python subprocess模块常见用法分析
Jun 12 Python
解决win64 Python下安装PIL出错问题(图解)
Sep 03 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
Python实现Singleton模式的方式详解
Aug 08 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
Dec 11 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
Mar 18 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
Feb 06 Python
用python自动生成日历
Apr 24 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导出excel格式数据问题
2014/03/11 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
javascript 进度条 实现代码
2009/07/30 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
JSONP跨域请求
2017/03/02 Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
2017/11/07 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
[03:56]DOTA2完美大师赛趣味视频之小鸽子和Mineski打台球
2017/11/24 DOTA
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
django中的图片验证码功能
2019/09/18 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
Python Pandas数据分析工具用法实例
2020/11/05 Python
巴西最大的家电和百货零售商:Casas Bahia
2016/11/22 全球购物
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
过滤器的用法
2013/10/08 面试题
外贸业务员工作职责
2014/01/06 职场文书
学校三节实施方案
2014/06/09 职场文书
应聘教师自荐书
2014/06/16 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP