Python命名空间
命名空间namespace
定义
我对于命名空间的理解是,由变量名到对象的一个映射,相当于字典中的key对应一个values。所以在同一个环境中,不能有相同的key,但在不同的环境中,key的值是可以重复的。
namespace又可以分为三类:
- 内建命名空间(Builtins):在启动python解释器时创建,我觉得是特殊的全局命名空间,因为它相当于导入了builtins模块
- 全局命名空间(Global):在导入模块时创建
- 局部命名空间(Local):在调用函数时创建
- 内嵌函数命名空间(Enclosing):函数内嵌函数时的特殊局部命名空间
创建
由以上的定义可以知道,在执行一个py脚本的时候,命名空间的创建流程是:内建->全局->局部(前提是内部有函数的调用)
Python 3.7.0 (default, Jun 28 2018, 07:39:16)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def func1():
... name = 1
... print('localspace:',locals())
... print('globalspace:',globals())
... def func2():
... print('before func1 local:',locals())
... print('before func1 global:',globals())
... ayu = name
... print('after func1 local:',locals()) #1
... print('after func1 global:',globals())
... func2() #2
... print('after func2 local:',locals())
... print('after func2 global:',globals())
...
>>> func1()
localspace: {'name': 1}
globalspace: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'func1': <function func1 at 0x10384c598>}
before func1 local: {'name': 1}
before func1 global: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'func1': <function func1 at 0x10384c598>}
after func1 local: {'name': 1, 'ayu': 1}
after func1 global: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'func1': <function func1 at 0x10384c598>}
after func2 local: {'name': 1, 'func2': <function func1.<locals>.func2 at 0x103855378>}
after func2 global: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'func1': <function func1 at 0x10384c598>}
>>> del(func1) #3
>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}
>>>
以上代码在命令行中执行,#2中调用完func2之后,#1中的局部命名空间被删除,执行#3之后,func1中的全局命名空间被删除,而builtins命名空间需要在退出解释器后才会被回收
所以命名空间回收的顺序是局部->全局->builtins
调用
在调用变量是,遵循LEGB的顺序,即Local->Enclosing(前提是有内嵌函数)->Global->Builtins
>>> def func1():
... x = 1
... print(x)
... def func2():
... x += x
... print(x)
... func2()
...
>>> func1()
1
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "<stdin>", line 7, in func1File "<stdin>", line 5, in func2
UnboundLocalError: local variable 'x' referenced before assignment
>>>
在执行func2时会报错,因为执行func2时,会在局部变量中创建x,然后从其局部变量中查找x,始终没有到Enclosing中取。
参考的博客
由一个例子到python的名字空间
详解python命名空间和作用域
转载于:https://blog.51cto.com/dorebmoon/2336954
Python命名空间相关推荐
- Python命名空间的本质
Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则. 接下来我将分四部分揭示Python命名空间的本质:一.命名 ...
- [转载] Python命名空间和作用域
参考链接: Python命名空间和范围 Python命名空间和作用域 Python作用域和命名空间命名空间作用域 全局变量和局部变量global和nonlocal关键字 Python作用域和命名空间 ...
- python namespace,python命名空间(namespace)简单介绍
python命名空间(namespace)简单介绍 发布时间:2020-09-08 07:20:33 来源:脚本之家 阅读:127 作者:人生与戏 命名空间: 每一个作用域变量存储的位置,或者解释为 ...
- [转载] 你真的知道什么是 Python“命名空间” 吗?
参考链接: Python命名空间和范围 写在之前 命名空间,又名 namesapce,是在很多的编程语言中都会出现的术语,估计很多人都知道这个词,但是让你真的来说这是个什么,估计就歇菜了,所以我觉得 ...
- python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...
本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...
- python 命名空间冲突_通过修改命名空间绕过pb冲突
背景 在实际工作当中,很多服务框架本身会依赖pb,但是和tf的pb会发生冲突[通常是因为pb比较老或者版本有冲突导致],所以本文介绍如何通过修改名空间的方式来绕过pb冲突. 修改名空间&编译p ...
- Python命名空间和作用域
变量是拥有匹配对象的名字(标识符).命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典. 一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量.如果一个局部变量和一 ...
- python命名空间特性_Python命名空间与作用域
名称空间名称空间(namespaces):用于存放名字与内存地址绑定关系的地方,是对栈区的划分 作用:名称空间可以使栈区中存放相同的名字,从而解决命名冲突 名称空间分为三种:内置名称空间 全局名称空间 ...
- python控制modem的at指令_硬件设计MCU架构+Python命名空间和作用域
硬件设计-MCU架构 CISC结构的单片机 其数据线和指令线分时复用,称为冯-诺伊曼结构 优点:指令丰富,功能较强,但确定取指令和取数据不能同时进行,速度受限,且价格也很高:属于CISC结构的单片机有 ...
最新文章
- Hibernate中Entity实体类的写法
- linux备份目录命令tar,Tar命令备份还原Linux系统
- html 价格计算,HTML打折计算价格实现原理与脚本代码
- 便携式办公套件LibreOffice Portable 4.0.1
- 解决ubuntu系统mysql open_files_limit配置不生效问题
- fread函数 linux在哪,fread函数返回值
- 【图像处理】美图秀秀使用技巧:抠图、透明、改色、教程
- python自动打开网页_python 自动批量打开网页的示例
- php源雄武,8个新鲜的PHP常用代码
- VC++:菜单的使用总结
- 三层交换机实现vlan间通信
- python处理excel文件有哪些常用的库?
- Linux下常用的编辑文件与保存命令
- 计算机二级c语言选择题及答案,全国计算机二级c语言练习题及答案
- ModuleNotFoundError: No module named 'lightgbm'
- android t时间工具,Android Market:正點工具箱,6大好用工具集一身
- java毕业设计实验室主页系统源码+lw文档+mybatis+系统+mysql数据库+调试
- Spring——七大核心模块
- js加密怎样不让别人看到
- oracle dg 增加redo组,【学习笔记】Oracle Data Guard 修改dataguard主库redo组数和大小
热门文章
- IT-标准化-系列-0.课程-V1.0
- 看了SUMTEC的稍微思考了一下…… 感触颇深。讲一件身边的事:
- Linux常用命令——压缩与解压缩命令
- Java 有关于线程
- HDU-3743 Minimum Sum,划分树模板
- hdu2041 dp
- ZLMS教学管理平台系统V1.2.0最新版本发布,支持纯Web视频直播点播,还带运营在线支付功能!完全免费提供!...
- OpenCV单kinect多帧静止场景的深度图像去噪
- YUV图像实时去雾算法的优化与改进
- Android Studio中ButterKnife插件的安装与使用