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算法学习之计数排序实例
Dec 18 Python
python中aioysql(异步操作MySQL)的方法
Apr 11 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
bluepy 一款python封装的BLE利器简单介绍
Jun 25 Python
pyQt5实时刷新界面的示例
Jun 25 Python
python实现代码统计程序
Sep 19 Python
Django+Celery实现动态配置定时任务的方法示例
May 26 Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 Python
如何卸载python插件
Jul 08 Python
python安装cx_Oracle和wxPython的方法
Sep 14 Python
Python安装并操作redis实现流程详解
Oct 13 Python
Python中文纠错的简单实现
Jul 07 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
解析MySql与Java的时间类型
2013/06/22 PHP
PHP查询分页的实现代码
2017/06/09 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
php DES加密算法实例分析
2019/09/18 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
js继承 Base类的源码解析
2008/12/30 Javascript
浅析return false的正确使用
2013/11/04 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
Python简单进程锁代码实例
2015/04/27 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
Django如何自定义分页
2018/09/25 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
django的ORM操作 增加和查询
2019/07/26 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
python之生成多层json结构的实现
2020/02/27 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
详解Python多线程下的list
2020/07/03 Python
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
爱普生美国官网:Epson美国
2018/11/05 全球购物
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
中医药大学毕业生自荐信
2013/11/08 职场文书
幼师大班个人总结
2015/02/13 职场文书
公司费用报销管理制度
2015/08/04 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技
利用JavaScript写一个简单计算器
2021/11/27 Javascript