26. 命名空间
创始人
2024-05-17 06:24:54
0

前言:如果你接触过c/c++/c#/java,那么对于python中的命名空间也是如此,只不过在些许地方存在细微差异,不过倒无伤大雅。

1. 定义

命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 python 字典来实现的。
命名空间提供了在项目中避免名字冲突的一种方法各个命名空间之间相互独立,没有任何关系同一个命名空间中不能有重名的,但不同的命名空间是可以重名而没有任何影响
实际上命名空间和操作系统中的文件系统的思想是类似的,分而治之就比如说,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名


Notice:同一个命名空间中不能有重名的,该怎么理解???

# 我们在全局的命名空间中定义了变量num, 变量赋值num=1后再赋值num=2, 
# 这里实际是新生成一个int值对象2, 再让num指向它,而1被丢弃, 不是改变a的值, 相当于新生成了num.
# 我们通过id()就可以清晰的看出, 两次num的id值确实不同. 
# 先num=1, 再num=2的行为在c/c++中就是变量重定义的行为, 是万万不行的, 但是在python中, 却是合理的.
# 可以这么理解, num一开始指向存储对象1的那块内存空间, 后来它有指向了对象2所指代的那块内存空间.
num =1
print(id(num))
num =2
print(id(num))print(num)print('-----------------------')
def test():print('Hello')print(id(test))def test():print('world')
print(id(test))test()

在这里插入图片描述
[Question]:那这样一来,同一个命名空间中不能有重名的这句话究竟该怎么去理解它,我表示怀疑,此处目前留待查证,后续给出相关解释

2. 有什么好处

现在的软件项目都是一个团队协作,共同开发,每个人开发不同的功能,生成不同的python模块。因此,很容易出现同名的变量、函数或者类定义。那么有了命名空间,这个问题很容易就解决了。因为,不同的模块有不同的命名空间,命名空间之间是相互独立的。

3. 三种命名空间

python中存在3中命名空间。
3.1 内置命名空间(built-in names)
  python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
(1) python 解释器内置了很多函数, 不需要使用 import 导入即可使用。

# python 程序可以直接使用内置函数max()和abs().
print(max(1,12))
print(abs(-2))

(2) python 提供了一个内置命名空间,用于记录这些内置函数。python 中存在一个特殊的 builtins 模块,它记录了所有的内置函数。

import builtins
print(dir(builtins))  # dir()列出builtins模块中的变量和函数的名称

在这里插入图片描述

3.2 全局命名空间(global names)
模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
(1) python 中的内置函数 globals() 返回表示全局命名空间的字典。

# 在全局空间定义类Studnet, 函数test(), 变量s1和s2
class Student:def __init__(self, num):self.num = numdef show(self):passdef test():passs1 = Student(101)
s2 = Student(102)print(globals())
# 程序输出
# 输出包括了 Student、test、s1和s2, 它们是用户定义的全局函数和变量.
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001ADFF046D00>, '__spec__': None,'__annotations__': {}, '__builtins__': , '__file__': 'F:\\编程系列\\Python\\Python\\_01_Essential\\temp.py', '__cached__': None, 'Student': , 'test': , 's1': <__main__.Student object at 0x000001ADFF1E2FD0>, 's2': <__main__.Student object at 0x000001ADFF1E2F10>
}

3.3 局部命名空间(local names)
函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)
(1) python 中的内置函数 locals() 返回表示全局命名空间的字典。

# Student类的构造函数中定义两个参数num, name, 以及在test()中定义一个局部变量addr.
# test()中定义2个参数num1, num2, 以及局部变量temp.
# 输出了函数参数和函数中定义的局部变量.
# Notice:locals()不能在全局中打印, 否则无法打印出以下效果.
class Student:def __init__(self, num, name):self.num = numself.name = nameprint(locals())def test(self):addr = 'SuZhou'print(locals())def test(num1, num2):temp = 2print(locals())return num1 + num2 + temptest(1, 3)
print('------')
Student(101, 'Zhang').test()

在这里插入图片描述

4. 命名空间的查找顺序

假设我们要使用变量 temp,则 python 的查找顺序为:局部的命名空间 -> 全局命名空间 -> 内置命名空间
如果找不到变量 temp,它将放弃查找并引发一个 NameError 异常。
(1) 在局部命名空间中,查找变量;
(2) 如果找不到,则在全局命名空间中,查找变量;
(3) 如果找不到,则在内置命名空间中,查找变量;
(4) 如果找不到,则抛出 NameError 异常。

# 示例性代码
tel = 101
name = 'Zhang'def test(num1, num2):temp1 = 12temp2 = 24# 在此处访问某个变量'''内置命名空间, 包括: max、min、abs 等内置函数全局命名空间, 包括:tel, name, test()局部命名空间, 包括:num1, num2, temp1, temp2''''''如果访问的变量是num1, 则能在局部命名空间中找到; 如果访问的变量是tel, 则能在全局命名空间中找到; 如果访问的变量是max,则能在内置命名空间中找到; 如果访问的变量是 x,在以上三个命名空间中查找不到, 此时抛出异常 NameError.'''test()

5. 命名空间的生命周期

命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...