『无为则无心』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表达式的主要作用就是化简代码. 匿名函数 ...
随机推荐
- SQL count和sum
count(1).count(*)与count(列名)的执行区别 count(1) and count(字段) 两者的主要区别是 (1) count(1) 会统计表中的所有的记录数,包含字段为null ...
- spring mvc idea创建
创建项目 创建项目 --> Spring --> Spring MVC --> 下面选择Download,会显示Spring MVC-5版本 如果是首次使用IDEA,因为没有配置ma ...
- Oracle存储过程游标for循环怎么写
一.不带参数的游标for循环 首先编写存储过程的整体结构,如下: create or replace procedure test_proc is v_date date; --变量定义 begin ...
- Dubbo多协议支持
除了Dubbo服务暴露协议Dubbo协议外,Dubbo框架还支持另外8种服务暴露协议:RMI协议.Hessian协议.HTTP协议.WebService协议.Thrift协议.Memcached协议. ...
- 【Service】【Web】【Middleware】Tomcat
1. 概念 1.1. 官方网站:tomcat.apache.org 1.2. tomcat的组件 <Server> <Service> <Connector/> & ...
- Maven配置大全
maven项目打jar包(带依赖) <build> <plugins> <plugin> <artifactId>maven-assembly-plug ...
- Nginx安全检查
1.检查是否配置Nginx账号锁定策略 描述 1.执行系统命令passwd -S nginx来查看锁定状态 出现Password locked证明锁定成功 如:nginx LK ..... (Pass ...
- cmd窗口连接mongodb服务端
1----->配置环境变量,将mongodb\bin目录配置到path 2----->打开cmd窗口,进入到bin目录,测试mongodb服务端是否在运行:net start mongod ...
- Shell 语法和tips -- 持续更新
1. 字符串掐头去尾 #, % 例如:x=aabbaarealwwvvwwecho "${x%w*w}"aabbaarealwwvv echo "${x%%w*w}&qu ...
- APS高级计划排程系统和生产排产系统
一.什么是APS高级计划排程系统 APS高级计划与排程是解决生产排程和生产调度问题,常被称为排序问题或资源分配问题. 目前,市场逐步走向个性化.以销定产模式:生产逐步以多品种小批量形成存在.对于离散制 ...