
python 之名称空间与作用域
局部名称空间 全局名称空间 内置名称空间 内置名称空间 全局名称空间 局部名称空间 局部名称空间 全局名称空间 内置名称空间
发布日期:2021-05-04 19:07:10
浏览次数:14
分类:精选文章
本文共 1537 字,大约阅读时间需要 5 分钟。
Python 之 名称空间与作用域
栈区与堆区的关系
在Python中,变量名与内存地址的映射关系存储在栈区中,而实际值的存储位置则位于堆区。栈区用于记录变量名到内存地址的映射关系,堆区则存储变量的实际值。
一、名称空间
起步
名称空间是什么?
名称空间是存储变量名与对象绑定关系的地方。简单来说,名称空间相当于一个大字典,记录了变量名对应的内存地址。名称空间是虚拟概念,实际存储在栈区中。核心概念
名称空间是否具有包含关系?
名称空间之间本质上是没有包含关系的。每个名称空间都是独立的,互不干扰。例如,内置名称空间、全局名称空间和局部名称空间各自独立。为什么需要名称空间?
名称空间的主要作用是允许多个变量名共存,不互相干扰。通过名称空间,Python可以在不同作用域中使用相同的变量名,而不导致命名冲突。
查找顺序
在查找变量时,Python遵循以下优先级:
三种名称空间的个数规定:
- 内置名称空间和全局名称空间各只有一个。
- 局部名称空间可以有多个。
二、名称空间的分类
1. 内置名称空间
内置名称空间存储了Python解释器内置的函数和变量。
例如:len
是内置函数,print
也是内置函数。内置名称空间的存活周期与解释器一致,解释器关闭则销毁。 2. 全局名称空间
全局名称空间存储了文件级别的变量。
例如:x = 1
定义在全局名称空间中。全局名称空间的存活周期与文件执行期间一致。 3. 局部名称空间
局部名称空间存储了函数内部定义的变量。
例如:def func():
x = 222
func()
在调用函数时,局部名称空间临时生效,函数调用结束后则失效。 三、名称空间的关系
名称空间的加载顺序是:
名称空间的销毁顺序是:
名称空间的查找优先级是:
在当前作用域内,先检查局部名称空间,再依次向上查找全局名称空间和内置名称空间。四、作用域
全局作用域
全局作用域包含全局名称空间和内置名称空间。全局变量的生效范围是整个程序生命周期。
局部作用域
局部作用域包含局部名称空间。局部变量的生效范围仅限于函数调用期间。
全局与局部的互动
局部作用域可以引用全局作用域的变量,但无法修改其值。例如:
x = 10
def func():
print(x)
func()
输出结果会是 10,因为局部作用域无法修改全局变量。
五、global与nonlocal关键字
global关键字
global
关键字用于声明一个变量属于全局作用域。它只能用于局部名称空间中,且只能用于不可变类型的变量。
使用场景:
x = 1
def func():
global x
x = 2
func()
全局变量会被修改。
nonlocal关键字
nonlocal
关键字用于在函数嵌套中修改外层函数的局部变量。它只能用于局部名称空间中的函数嵌套。
使用场景:
x = 111
def f1():
x = 222
def f2():
nonlocal x
x = 333
f2()
f2() 调用会修改 f1() 中的 x。
注意事项
nonlocal
关键字只能在函数嵌套中使用,第一层函数无法使用。- 语句中列出的名称不得与局部作用域中的变量名冲突。
总结与实战技巧
- 三个名称空间的查找顺序是 LEGB(Local > Enclosed > Global > Built-in)。
- 全局变量与局部变量的互动需要正确使用
global
和nonlocal
关键字。 - 在处理可变类型时,应避免直接修改全局变量,使用内置方法进行操作。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月27日 07时26分47秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
STM8 GPIO模式
2019-03-05
omnet++
2019-03-05
23种设计模式一:单例模式
2019-03-05
Qt中的析构函数
2019-03-05
C语言实现dijkstra(adjacence matrix)
2019-03-05
C语言学习从初级到精通的疯狂实战教程-徐新帅-专题视频课程
2019-03-05
三层框架+sql server数据库 实战教学-徐新帅-专题视频课程
2019-03-05
NAT工作原理
2019-03-05
Processes, threads and goroutines
2019-03-05
c++中的10种常见继承
2019-03-05
wxpython的Hello,World代码探索
2019-03-05
【数字图像处理】OpenCV3 学习笔记
2019-03-05
【单片机开发】智能小车工程(经验总结)
2019-03-05
【单片机开发】基于stm32的掌上游戏机设计 (项目规划)
2019-03-05
KeepAlived介绍、配置示例、KeepAlived配置IPVS、调用脚本进行监控
2019-03-05
Scala集合-数组、元组
2019-03-05
04 程序流程控制
2019-03-05
C++&&STL
2019-03-05
子集(LeetCode 78)
2019-03-05
1093 Count PAT‘s (25分) 含DP做法
2019-03-05