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中的urllib模块使用详解
Jul 07 Python
Python手机号码归属地查询代码
May 04 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
numpy下的flatten()函数用法详解
May 27 Python
Python换行与不换行的输出实例
Feb 19 Python
python实现将range()函数生成的数字存储在一个列表中
Apr 02 Python
Python基于pandas爬取网页表格数据
May 11 Python
Python计算矩阵的和积的实例详解
Sep 10 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 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 随机生成10位字符代码
2009/03/26 PHP
PHP 引用文件技巧
2010/03/02 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
js中cookie的添加、取值、删除示例代码
2013/10/21 Javascript
js实现拖拽效果
2015/02/12 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
python实现给数组按片赋值的方法
2015/07/28 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
Python实现动态循环输出文字功能
2020/05/07 Python
Python pandas如何向excel添加数据
2020/05/22 Python
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
会议邀请书范文
2014/02/02 职场文书
逃课上网检讨书
2014/02/20 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
村党建工作汇报材料
2014/11/02 职场文书
三孔导游词
2015/02/05 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers