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 相关文章推荐
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
Python 遍历列表里面序号和值的方法(三种)
Feb 17 Python
python+requests+unittest API接口测试实例(详解)
Jun 10 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
在CentOS6上安装Python2.7的解决方法
Jan 09 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
Aug 09 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
Mar 09 Python
解决Python spyder显示不全df列和行的问题
Apr 20 Python
利用python对mysql表做全局模糊搜索并分页实例
Jul 12 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
Aug 07 Python
浅析Python中字符串的intern机制
Oct 03 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
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
php GUID生成函数和类
2014/03/10 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
php图像验证码生成代码
2017/06/08 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
js arguments.callee的应用代码
2009/05/07 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
通过JS来判断页面控件是否获取焦点
2014/01/03 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
iframe中子父类窗口调用JS的方法及注意事项
2015/08/25 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
js 函数性能比较方法
2020/08/24 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
python读取文件名称生成list的方法
2018/04/27 Python
python 获取字符串MD5值方法
2018/05/29 Python
python实现的生成word文档功能示例
2019/08/23 Python
详解Python3定时器任务代码
2019/09/23 Python
Python中包的用法及安装
2020/02/11 Python
tensorflow 分类损失函数使用小记
2020/02/18 Python
Python2手动安装更新pip过程实例解析
2020/07/16 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
体育节口号
2014/06/19 职场文书
违反交通法规检讨书
2014/09/10 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书