Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。

接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间的查找顺序;三、命名空间的生命周期;四、通过locals()和globals() BIF访问命名空间

重点是第四部分,我们将在此部分观察命名空间的内容。

一、命名空间

Python使用叫做命名空间的东西来记录变量的轨迹。命名空间是一个 字典(dictionary) ,它的键就是变量名,它的值就是那些变量的值。
A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。

在一个 Python 程序中的任何一个地方,都存在几个可用的命名空间。
1、每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
2、每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
3、还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。

二、命名空间查找顺序

当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:
1、局部命名空间:特指当前函数或类的方法。如果函数定义了一个局部变量 x,或一个参数 x,Python 将使用它,然后停止搜索。
2、全局命名空间:特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
3、内置命名空间:对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。
4、如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name ‘aa’ is not defined。

嵌套函数的情况:
1、先在当前 (嵌套的或 lambda) 函数的命名空间中搜索
2、然后是在父函数的命名空间中搜索
3、接着是模块命名空间中搜索
4、最后在内置命名空间中搜索

示例:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
info = "Adress : "
def func_father(country):def func_son(area):city= "Shanghai " #此处的city变量,覆盖了父函数的city变量print(info + country + city + area)city = " Beijing "#调用内部函数func_son("ChaoYang ");func_father("China ")

输出:Adress : China Shanghai ChaoYang

以上示例中,info在全局命名空间中,country在父函数的命名空间中,city、area在自己函数的命名空间中

三、命名空间的生命周期

不同的命名空间在不同的时刻创建,有不同的生存期。
1、内置命名空间在 Python 解释器启动时创建,会一直保留,不被删除。
2、模块的全局命名空间在模块定义被读入时创建,通常模块命名空间也会一直保存到解释器退出。
3、当函数被调用时创建一个局部命名空间,当函数返回结果 或 抛出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。

Python 的一个特别之处在于其赋值操作总是在最里层的作用域。赋值不会复制数据——只是将命名绑定到对象。删除也是如此:“del y” 只是从局部作用域的命名空间中删除命名 y 。事实上,所有引入新命名的操作都作用于局部作用域。

示例:

i=1
def func2():i=i+1func2();
#错误:UnboundLocalError: local variable 'i' referenced before assignment

由于创建命名空间时,python会检查代码并填充局部命名空间。在python运行那行代码之前,就发现了对i的赋值,并把它添加到局部命名空间中。当函数执行时,python解释器认为i在局部命名空间中但没有值,所以会产生错误。

def func3():y=123del yprint(y)func3()
#错误:UnboundLocalError: local variable 'y' referenced before assignment
#去掉"del y"语句后,运行正常

四、命名空间的访问

1、局部命名空间可以 locals() BIF来访问。
locals 返回一个名字/值对的 dictionary。这个 dictionary 的键是字符串形式的变量名字,dictionary 的值是变量的实际值。
示例:

def func1(i, str ):x = 12345print(locals())func1(1 , "first")

输出:{‘str’: ‘first’, ‘x’: 12345, ‘i’: 1}

2、全局 (模块级别)命名空间可以通过 globals() BIF来访问。
示例:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import copy
from copy import deepcopygstr = "global string"def func1(i, info):x = 12345print(locals())func1(1 , "first")if __name__ == "__main__":print("the current scope's global variables:")dictionary=globals()print(dictionary)

输出:(我自己给人为的换行、更换了顺序,加颜色的语句下面重点说明)

{'__name__': '__main__',
'__doc__': 'Created on 2013-5-26',
'__package__': None,
'__cached__': None,
'__file__': 'E:\\WorkspaceP\\Test1\\src\\base\\test1.py',
'__loader__': <_frozen_importlib.SourceFileLoader object at 0x01C702D0>,
'copy': <module 'copy' from 'D:\\Python33\\lib\\copy.py'>,
'__builtins__': <module 'builtins' (built-in)>,
'gstr': 'global string',
'dictionary': {...},
'func1': <function func1 at 0x01C6C540>,
'deepcopy': <function deepcopy at 0x01DB28A0>
}

总结
  1、模块的名字空间不仅仅包含模块级的变量和常量,还包括所有在模块中定义的函数和类。除此以外,它还包括了任何被导入到模块中的东西。
  2、我们看到,内置命名也同样被包含在一个模块中,它被称作 __ builtin__。
  3、回想一下 from module import 和 import module 之间的不同。
使用 import module,模块自身被导入,但是它保持着自已的名字空间,这就是为什么您需要使用模块名来访问它的函数或属性:module.function 的原因。
    
但是使用 from module import function,实际上是从另一个模块中将指定的函数和属性导入到您自己的名字空间,这就是为什么您可以直接访问它们却不需要引用它们所来源的模块。使用 globals 函数,您会真切地看到这一切的发生,见上面的红色输出语句。

3、 locals 与 globals 之间的一个重要的区别
locals 是只读的,globals 不是

示例:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func1(i, info):x = 12345print(locals())locals()["x"]= 6789print("x=",x)y=54321
func1(1 , "first")
globals()["y"]= 9876
print( "y=",y)

输出:

{'i': 1, 'x': 12345, 'info': 'first'}
x= 12345
y= 9876

解释:
locals 实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行改变对局部名字空间中的变量值并无影响。
globals 返回实际的全局名字空间,而不是一个拷贝。所以对 globals 所返回的 dictionary 的任何的改动都会直接影响到全局变量。

Python命名空间的本质相关推荐

  1. Python命名空间

    命名空间namespace 定义 我对于命名空间的理解是,由变量名到对象的一个映射,相当于字典中的key对应一个values.所以在同一个环境中,不能有相同的key,但在不同的环境中,key的值是可以 ...

  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. Python零基础学习代码实践 —— 提取字符串里面的单词数
  2. 服务器 ha linux,Linux 高可用(HA)集群之Heartbeat详解
  3. springcloud的简单使用_微服务架构:初识Spring Cloud
  4. 魔幻阵matlab,MatLab入门手册
  5. Android/ios/h5 三步调起QQ群聊,一键加群
  6. 因果分析.科学实验评估
  7. 第七十六篇 MIPI简单说明
  8. Tanzu Observability by Wavefront Spring Boot Starter
  9. 2022北林计科学生保研历程
  10. WIN10系统从睡眠状态唤醒后电脑变卡顿
  11. 撸了一次 Js 代码
  12. OpenWRT 学习笔记 -- 用户自定义添加app的开机自启动
  13. JAVASE面向对象基础
  14. 丰田召回事件的深层次原因
  15. Sublime Text(轻量级的文本编辑类软件)
  16. 在linux服务器下配置代理服务器( 使用liunx服务器的ip用来代理 )
  17. 如何保证API不被别人恶意调用(彩蛋)
  18. JS弹出确认、取消对话框
  19. java使用es查询地理位置信息
  20. Linux字符界面与图形界面的切换

热门文章

  1. Redis集群技术及Codis实践
  2. WebPack在多页应用项目中的探索
  3. python打出由边框包围的_python – 提取边框并将其保存为图像
  4. 大神TP_英雄联盟:男枪瞬秒大龙,佐伊遍地TP,新版本BUG谁来监管?
  5. 【ABAP】获取后台Job相关状态
  6. 【SAP】自定义权限对象
  7. SAP R/3 中会计凭证和物料凭证的对应关系
  8. AFAB 科目要求一个成本会计分配
  9. 哪些医药企业使用SAP系统呢?
  10. 销售Invoice管理流程