『无为则无心』Python函数 — 31、命名空间(namespace)
1、什么是命名空间
命名空间指的是变量存储的位置,每一个变量都需要存储到指定的命名空间当中。
全局命名空间用来保存全局变量,函数命名空间用来保存函数中的变量。也就是说每一个作用域都会有一个它对应的命名空间,全局作用域就会有一个全局的命名空间,函数作用域就会有一个函数的命名空间。
命名空间实际上就是一个字典,是一个专门用来存储变量的字典。
命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。
我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。
2、三种命名空间
- 内置名称(
built-in names
), Python语言内置的名称,比如函数名abs
、char
和异常名称BaseException
、Exception
等等。 - 全局名称(
global names
),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。 - 局部名称(
local names
),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)
如下图所示:
3、命名空间查找顺序
假设我们要使用变量runoob
,则Python的查找顺序为:局部的命名空间 -> 全局命名空间 -> 内置命名空间。
如果找不到变量runoob
,它将放弃查找并引发一个NameError
异常:NameError: name 'runoob' is not defined
。
4、命名空间的生命周期
命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。
因此,我们无法从外部命名空间访问内部命名空间的对象。
5、如何获取当前的命名空间
locals()
函数用来获取当前作用域的命名空间。
也就是如果在全局作用域中调用locals()
函数,则获取全局命名空间,如果在函数作用域中调用locals()
函数则获取函数命名空间,最终返回的是一个字典。
示例如下:
c = 10
def fn(a):
# 在函数中对形参进行重新赋值,不会影响其他的变量
a = 20
print('a =', a, id(a))
# 当前命名空间
scope = locals()
# 打印命名空间
print(scope)
# 查看locals()函数返回的对象类型
print(type(scope))
"""
输出结果;
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000025222C8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'F:/PyCharmWorkspace/hello-python-01/firstpythonfile.py', '__cached__': None, 'c': 10, 'fn4': <function fn4 at 0x0000000002575798>, 'scope': {...}}
<class 'dict'>
"""
我们可以看到命名空间就是一个字典,我们在程序中定义的全局变量c
也可以在返回的字典中查看到。
# 那其实打印全局变量c就有两种方式
scope = locals()
print("c =", c) # c = 10
print("c =", scope['c']) # c = 10
同理,向命名空间的字典中添加key-value
,就相当于在全局中创建了一个变量,但一般不建议这么做。
# NameError: name 'f' is not defined
print("f =", f)
# 向命名空间中添加一个key-value
scope = locals()
scope['f'] = 1000
print("f =", f) # f = 1000
全局和函数内部的命名空间同理。
全局作用域的地方是不能获取到函数作用域中命名空间的信息的。但是函数作用域中可以使用globals()
函数,获取全局命名空间的信息。
def fn():
global_scope = globals()
总结:我们只要知道有命名空间这个概念就行,实际上就是个字典,我们开发的时候一般不会修改命名空间的。
『无为则无心』Python函数 — 31、命名空间(namespace)的更多相关文章
- 『无为则无心』Python函数 — 25、Python中的函数
目录 1.函数的使用 (1)定义函数 (2)调用函数 (3)使用函数的注意事项 2.函数的参数 3.实参的类型 Python函数的说明: Python中函数的应用非常广泛,前面章节中我们已经接触过多个 ...
- 『无为则无心』Python函数 — 26、Python函数参数的传递方式
目录 1.位置参数 2.关键字参数 3.缺省参数(默认参数) 4.不定长参数(可变参数) (1)包裹位置传递 (2)包裹关键字传递 5.位置参数.默认参数.可变参数的混合使用 6.拓展:参数解包 提示 ...
- 『无为则无心』Python函数 — 28、Python函数的简单应用
目录 1.函数嵌套调用 2.Python函数的简单应用 (1)打印线条 (2)函数计算 (3)打印图形 3.函数的说明文档 (1)函数的说明文档的作用 (2)函数说明文档的语法 (3)查看函数的说明文 ...
- 『无为则无心』Python函数 — 27、Python函数的返回值
目录 1.返回值概念 2.return关键字的作用 3.返回值可以返回的数据类型 4.函数如何返回多个值 5.fn5 和 fn5()的区别 6.总结: 1.返回值概念 例如:我们去超市购物,比如买饮料 ...
- 『无为则无心』Python函数 — 29、Python变量和参数传递
目录 1.Python的变量 (1)Python变量不能独立存在 (2)变量是内存中数据的引用 (3)注意点 2.了解变量的引用 3.Python的参数传递(重点) (1)示例 (2)结论 (3)总结 ...
- 『无为则无心』Python函数 — 30、Python变量的作用域
目录 1.作用于的概念 2.局部变量 3.全局变量 4.变量的查找 5.作用域中可变数据类型变量 6.多函数程序执行流程 1.作用于的概念 变量作用域指的是变量生效的范围,在Python中一共有两种作 ...
- 『无为则无心』Python函数 — 32、递归
目录 1.什么叫递归函数 2.递归的应用场景 3.递归的特点 4.应用:3以内数字累加和 5.应用:阶乘 6.总结 1.什么叫递归函数 Python中,在函数内部,可以调用其他函数.如果一个函数在内部 ...
- 『无为则无心』Python函数 — 33、高阶函数
目录 1.高阶函数的定义 2.体验高阶函数 3.内置高阶函数 (1)map()函数 (2)reduce()函数 (3)filter()函数 1.高阶函数的定义 把函数作为参数传入(把一个函数作为另外一 ...
- 『无为则无心』Python函数 — 34、lambda表达式
目录 1.lambda的应用场景 2.lambda语法 3.快速入门 4.示例:计算a + b 5.lambda的参数形式 6.lambda的应用 lambda表达式的主要作用就是化简代码. 匿名函数 ...
随机推荐
- 编译安装nginx 1.16
准备源码包,并解压,创建nginx用户 [root@slave-master ~]# tar xf nginx-1.16.0.tar.gz [root@slave-master ~]# useradd ...
- [源码解析] PyTorch分布式优化器(3)---- 模型并行
[源码解析] PyTorch分布式优化器(3)---- 模型并行 目录 [源码解析] PyTorch分布式优化器(3)---- 模型并行 0x00 摘要 0x01 前文回顾 0x02 单机模型 2.1 ...
- jdk1.8帮助文档中文可搜索
jdk1.8帮助文档中文可搜索 链接:https://pan.baidu.com/s/11beeZLpEIhciOd14WkCpdg 提取码:t4lw
- Mysql实例 表设计
目录 一.介绍 二.设计表格 三.查询 查都有哪些公司 查A公司都放了哪些广告 查A公司10月份该交多少广告费 四.分析 表结构设置 sql语句 其它功能 一.介绍 有一个公司叫月亮集团,他们旗下有很 ...
- MySQL信息系统函数
- 10 - Vue3 UI Framework - Tabs 组件
标签页是非常常用的组件,接下来我们来制作一个简单的 Tabs 组件 返回阅读列表点击 这里 需求分析 我们先做一个简单的需求分析 可以选择标签页排列的方向 选中的标签页应当有下划线高亮显示 切换选中时 ...
- 尚硅谷SSM-CRUD实战Demo
SSM-CRUD实战项目 1. 项目总览 SpringMVC + Spring + MyBatis CRUD:增删改查 功能: 分页 数据校验 jquery前端校验+JSR303后端校验 ajax R ...
- LuoguP7071 [CSP-J2020] 优秀的拆分 题解
Content 给定一个数 \(n\),求是否能够拆分成 \(2\) 的正整数次幂的和的形式,并给出具体方案. 数据范围:\(1\leqslant n\leqslant 10^7\). Solutio ...
- Add File as a Link on Visual Studio
https://stackoverflow.com/questions/18963750/add-file-as-a-link-on-visual-studio-debug-vs-publish Ev ...
- 五、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-聊天输入框的实现
会话好友列表的实现 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入框扩展 ...