命名空间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命名空间相关推荐

  1. Python命名空间的本质

    Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则. 接下来我将分四部分揭示Python命名空间的本质:一.命名 ...

  2. [转载] Python命名空间和作用域

    参考链接: Python命名空间和范围 Python命名空间和作用域 Python作用域和命名空间命名空间作用域 全局变量和局部变量global和nonlocal关键字 Python作用域和命名空间 ...

  3. python namespace,python命名空间(namespace)简单介绍

    python命名空间(namespace)简单介绍 发布时间:2020-09-08 07:20:33 来源:脚本之家 阅读:127 作者:人生与戏 命名空间: 每一个作用域变量存储的位置,或者解释为 ...

  4. [转载] 你真的知道什么是 Python“命名空间” 吗?

    参考链接: Python命名空间和范围 写在之前 命名空间,又名 namesapce,是在很多的编程语言中都会出现的术语,估计很多人都知道这个词,但是让你真的来说这是个什么,估计就歇菜了,所以我觉得 ...

  5. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  6. python 命名空间冲突_通过修改命名空间绕过pb冲突

    背景 在实际工作当中,很多服务框架本身会依赖pb,但是和tf的pb会发生冲突[通常是因为pb比较老或者版本有冲突导致],所以本文介绍如何通过修改名空间的方式来绕过pb冲突. 修改名空间&编译p ...

  7. Python命名空间和作用域

    变量是拥有匹配对象的名字(标识符).命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典. 一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量.如果一个局部变量和一 ...

  8. python命名空间特性_Python命名空间与作用域

    名称空间名称空间(namespaces):用于存放名字与内存地址绑定关系的地方,是对栈区的划分 作用:名称空间可以使栈区中存放相同的名字,从而解决命名冲突 名称空间分为三种:内置名称空间 全局名称空间 ...

  9. python控制modem的at指令_硬件设计MCU架构+Python命名空间和作用域

    硬件设计-MCU架构 CISC结构的单片机 其数据线和指令线分时复用,称为冯-诺伊曼结构 优点:指令丰富,功能较强,但确定取指令和取数据不能同时进行,速度受限,且价格也很高:属于CISC结构的单片机有 ...

最新文章

  1. Hibernate中Entity实体类的写法
  2. linux备份目录命令tar,Tar命令备份还原Linux系统
  3. html 价格计算,HTML打折计算价格实现原理与脚本代码
  4. 便携式办公套件LibreOffice Portable 4.0.1
  5. 解决ubuntu系统mysql open_files_limit配置不生效问题
  6. fread函数 linux在哪,fread函数返回值
  7. 【图像处理】美图秀秀使用技巧:抠图、透明、改色、教程
  8. python自动打开网页_python 自动批量打开网页的示例
  9. php源雄武,8个新鲜的PHP常用代码
  10. VC++:菜单的使用总结
  11. 三层交换机实现vlan间通信
  12. python处理excel文件有哪些常用的库?
  13. Linux下常用的编辑文件与保存命令
  14. 计算机二级c语言选择题及答案,全国计算机二级c语言练习题及答案
  15. ModuleNotFoundError: No module named 'lightgbm'
  16. android t时间工具,Android Market:正點工具箱,6大好用工具集一身
  17. java毕业设计实验室主页系统源码+lw文档+mybatis+系统+mysql数据库+调试
  18. Spring——七大核心模块
  19. js加密怎样不让别人看到
  20. oracle dg 增加redo组,【学习笔记】Oracle Data Guard 修改dataguard主库redo组数和大小

热门文章

  1. IT-标准化-系列-0.课程-V1.0
  2. 看了SUMTEC的稍微思考了一下…… 感触颇深。讲一件身边的事:
  3. Linux常用命令——压缩与解压缩命令
  4. Java 有关于线程
  5. HDU-3743 Minimum Sum,划分树模板
  6. hdu2041 dp
  7. ZLMS教学管理平台系统V1.2.0最新版本发布,支持纯Web视频直播点播,还带运营在线支付功能!完全免费提供!...
  8. OpenCV单kinect多帧静止场景的深度图像去噪
  9. YUV图像实时去雾算法的优化与改进
  10. Android Studio中ButterKnife插件的安装与使用