Python基础语法(十三):命名空间与作用域
一、命名空间:变量名的"居住地"
1.1 核心概念
想象命名空间是一个大型公寓楼,每个"住户"(变量名)都有自己独立的"房间"(对象)。Python使用字典结构来实现这个"公寓楼管理":
- 核心特点:
- 解决名字冲突问题(不同楼层可以有同名住户)
- 同一层不允许重名(同一命名空间不能有重复变量名)
- 各层完全独立(命名空间之间互不干扰)
1.2 三大"公寓区"
类型 | "住户"示例 | 创建时机 | "拆迁"时间 |
---|---|---|---|
内置命名空间 | print , len , Exception | Python解释器启动时 | 解释器退出时 |
全局命名空间 | 模块级的函数/类/变量 | 模块被导入时 | 解释器退出时 |
局部命名空间 | 函数参数、内部变量 | 函数调用时(类定义时) | 函数返回时(类定义结束) |
二、作用域:变量的"活动范围"
2.1 核心机制
作用域就像给变量分配的"工作证":
- 静态性:代码写好的时候就确定了通行范围
- 动态性:实际访问时才会去命名空间查找具体值
2.2 四大"安全区域"
# 全局区(G)
global_var = "CEO"def outer():# 嵌套区(E)enclosing_var = "部门经理"def inner():# 局部区(L)local_var = "普通员工"print(len(local_var)) # 内置区(B)inner()
访问规则(LEGB):
- 先检查工位抽屉(Local)
- 再查部门文件柜(Enclosing)
- 然后看公司档案室(Global)
- 最后翻行业标准手册(Built-in)
三、跨区域协作:global & nonlocal
3.1 经典问题演示
company = "原始公司" # 全局def department():team = "A组" # 嵌套def employee():project = "X项目" # 局部team = "临时小组" # 新建局部变量company = "子公司" # 新建局部变量employee()print(team) # 输出"A组"print(company) # 输出"原始公司"
3.2 解决方案
修改全局变量 → 使用global
def change_global():global companycompany = "新集团公司"
修改嵌套变量 → 使用nonlocal
def change_team():nonlocal teamteam = "精英组"
3.3 对比实验
# 实验组(使用声明)
def demo_correct():global totaltotal = 100def inner():nonlocal total # 会报错!因为total是全局的total += 1inner()print(total)# 对照组(不使用声明)
def demo_shadowing():count = 10def inner():count = 20 # 新建局部变量inner()print(count) # 输出10
四、最佳实践建议
- 减少全局变量:像避免使用公用牙刷一样慎用global
- 明确作用域:函数参数>局部变量>闭包变量>全局变量
- 命名技巧:
- 全局变量用全大写(如
CONFIG
) - 局部变量用简短名称(如
idx
) - 避免与内置名称冲突(不要用
list=[]
)
- 全局变量用全大写(如