python | 命名空间与作用域
·
一、基本概念
- 命名空间 namespace存放变量名→值映射的字典,用来区分同名变量,互不冲突。常见 4 种:
- 内置命名空间(
builtins):print/len等系统函数 - 全局命名空间(
global):文件顶层变量 - 局部命名空间(
local):函数内部变量 - 嵌套命名空间:外层函数变量
- 作用域 scope变量能被访问到的范围
二、四大作用域(LEGB 规则)
查找顺序:L → E → G → B
- L Local 局部:函数内部
- E Enclosing 嵌套外层:外层函数(闭包用)
- G Global 全局:模块顶层
- B Built-in 内置:系统内置
口诀
先找自己,再找外层,再找全局,最后找内置
三、全局变量 & 局部变量
1. 正常访问
python
运行
a = 100 # 全局变量
def func():
print(a) # 可以读取全局
func()
2. 函数内修改全局 → 必须加 global
python
运行
a = 100
def func():
global a # 声明使用全局变量
a = 200
func()
print(a) # 200
不加global会被当成局部变量,报错。
3. nonlocal 关键字(嵌套函数改外层变量)
python
运行
def outer():
x = 10
def inner():
nonlocal x # 修改外层函数变量
x = 20
inner()
print(x)
outer()
nonlocal:只找外层函数,不找全局global:只找全局
四、常用内置函数
globals()查看全局命名空间locals()查看当前局部命名空间
python
运行
print(globals())
def f():
a=1
print(locals())
f()
五、易错点总结
- 函数内只读全局不用声明,修改必须 global
- 嵌套函数改外层变量用
nonlocal - 局部变量优先级 > 全局变量
- 代码块(if/for/while)不产生新作用域
python
运行
if True:
num = 99
print(num) # 能访问更多推荐



所有评论(0)