Python基础(十八):命名空间作用域
创始人
2025-05-31 09:49:31
0
  1. 命名空间

1.1.概念

命名空间(namespace)是名称到对象的映射,当前大部分命名空间都是通过 Python 字典来实现的,它的主要作用是避免项目中的名字冲突,每一个命名空间都是相对独立的,在不同的命名空间中可以同名,在相同的命名空间中不可以同名。

1.2.种类

命名空间主要有以下三种:

  • 内置:主要用来存放内置函数、异常等,比如:abs 函数、BaseException 异常。

  • 全局:指在模块中定义的名称,比如:类、函数等。

  • 局部:指在函数中定义的名称,比如:函数的参数、在函数中定义的变量等。

1.3.生命周期

通常在不同时刻创建的命名空间拥有不同的生命周期,看一下三种命名空间的生命周期:

  • 内置:在 Python 解释器启动时创建,退出时销毁。

  • 全局:在模块定义被读入时创建,在 Python 解释器退出时销毁。

  • 局部:对于类,在 Python 解释器读到类定义时创建,类定义结束后销毁;对于函数,在函数被调用时创建,函数执行完成或出现未捕获的异常时销毁。

  1. 作用域

2.1.概念

作用域是 Python 程序可以直接访问命名空间的文本区域(代码区域),名称的非限定引用会尝试在命名空间中查找名称,作用域是静态的,命名空间是随着解释器的执行动态产生的,因此在作用域中访问命名空间中的名字具有了动态性,即作用域被静态确定,被动态使用。

2.2.种类

Python 有如下四种作用域:

  • 局部:最先被搜索的最内部作用域,包含局部名称。

  • 嵌套:根据嵌套层次由内向外搜索,包含非全局、非局部名称。

  • 全局:倒数第二个被搜索,包含当前模块的全局名称。

  • 内建:最后被搜索,包含内置名称的命名空间。

作用域的搜索顺序通过下图直观的来看一下:

Python 中会按上图所示作用域由内向外去搜索名字。

再通过具体代码来对作用域作进一步了解,如下所示:

# 全局作用域
g = 1
def outer():# 嵌套作用域e = 2def inner():# 局部作用域i = 3

2.3.global&nonlocal

我们先来看一下全局变量与局部变量。

  • 全局变量:定义在函数外部的变量。

  • 局部变量:定义在函数内部的变量。

全局变量可以在整个程序范围内进行访问,而局部变量只能在函数内部访问。通过具体示例看一下:

# 全局变量
d = 0
def sub(a, b):# d 在这为局部变量d = a - bprint('函数内 : ', d)sub(9, 1)
print('函数外 : ', d)

执行结果:

函数内 :  8
函数外 :  0

当内部作用域想要修改外部作用域的变量时,就要用到 global 和 nonlocal 关键字了,下面通过具体示例来了解一下。

如果我们想将上面示例中 sub() 函数中的 d 变量修改为全局变量,则需使用 global 关键字,示例如下所示:

# 全局变量
d = 0
def sub(a, b):# 使用 global 声明 d 为全局变量global dd = a - bprint('函数内 : ', d)sub(9, 1)
print('函数外 : ', d)

执行结果:

函数内 :  8
函数外 :  8

如果需要修改嵌套作用域中的变量,则需用到 nonlocal 关键字。

不使用 nonlocal

我们先来看一下不使用 nonlocal 关键字的执行情况,如下所示:

def outer():d = 1def inner():d = 2print('inner:', d)inner()print('outer:', d)
outer()

执行结果:

inner:2
outer:1

使用 nonlocal

再来看一下使用了 nonlocal 关键字的执行情况,如下所示:

def outer():d = 1def inner():nonlocal dd = 2print('inner:', d)inner()print('outer:', d)
outer()

执行结果:

inner:2
outer:2

相关内容

热门资讯

安全生产月主题标语 安全生产月... 1 强化安全基础,推动安全发展2 加强班组安全管理,弘扬企业安全文化。3 安全发展,科学发展4 事故...
建筑工地安全标语100条 建筑... 1、安全第一 预防为主2、人人讲安全 安全为人人3、人人讲安全,事事为安全;时时想安全,处处要安全 ...
交通安全警句标语 交通安全警句... 1、醉(罪)在酒中,毁(悔)在杯中。2、十次肇事九次快,莫和死神去比赛。3、文明礼让安全在,瞬间麻痹...
最新或2023(历届)跨年QQ... 【心情签名说说】 想找个坚强的理由,可诸多的疼该如何一笑而过;想有个慰藉的港口,可真正懂你的人又有几...
交通安全横幅标语,交通安全横幅... 街道办悬挂在路口的交通安全横幅标语:一人出车全家念 一人平安全家福
SpringBoot高校餐厅缴... SpringBoot高校餐厅缴费系统 帮朋友基于SpringBoot鲜花商城系统,订制...
【Spring从成神到升仙系列... 👏作者简介:大家好,我是爱敲代码的小黄,独...
人生励志签名100句,qq人生... 1、知识愈浅,自信愈深。——苏联   2、勇敢乃是自信与害怕中间之道。——(希腊)亚里士多德  3、...
安全生产标语二十条,安全生产标... 1、关爱生命 安全发展 2、安全第一 预防为主 综合治理3、广泛深入开展“安全生产月...
关于青春的励志签名,创业励志签... 1、世上最重要的事,不在于我们在何处,而在于我们朝着什么方向走。   2、世上没有绝望的处境,只有对...
拼搏的励志签名,最新或2023... 1、如果你认为学校里的老师过于严厉,那么等你有了老板再回头想一想。   2、世界青睐有雄心壮志的人。...
春运安全标语,春运安全注意事项... 1、文明交通你我他,平安出行迎新春。 2、春运安全连万家,出行平安你我他。3、驾车莫贪杯中酒,平安幸...
访问网络服务-Go对IPC的支... 访问网络服务-Go对IPC的支持 文章目录访问网络服务-Go对IPC的支持一、socket与IPC1...
自己主持婚礼主持词精选 婚礼开...  自己主持婚礼主持词精选(一)  1、新人入场  新人踏着舞步走到一半,庄重登常  新郎:繁花似锦,...
浪婚礼主持词串词顺口溜 濠氬簡... 今天####年#月#日,天空因为今天的喜庆而变得格外晴朗,而大地也因为年青人的无限活力而充满了生机。...
最新或2023(历届)新年跨年... 最新或2023(历届)新年说说祝福大全一:过年要玩好,必须的;早餐别忘了,注意的;烟酒要减少,提醒的...
搞笑婚礼主持词精选 搞笑婚礼主... 开场音乐中 司仪登场 (秋天)  嘘,,,,多安静啊,一点掌声都没有,感谢大家无声的支持。  凉风有...
最新或2023(历届)鼠年qq...  最新或2023(历届)qq空间新年说说大全  一、 新年到来,百无禁忌。东行吉祥,南走顺利,西出平...
大模型落地比趋势更重要,NLP... 全球很多人都开始相信,以ChatGPT为代表的大模型,将带来一场NLP领...
Android开发-Andro... 01  Android UI 1.1  UI 用户界面(User Interface,...