Python 作用域(Scope)
·
一、Python 4 种作用域(LEGB 规则)
Python 有固定 4 层作用域,查找变量时从内到外依次找,找不到就报错:
| 缩写 | 名称 | 含义 | 例子 |
|---|---|---|---|
| L | Local(局部) | 函数 / 方法内部 | 函数里定义的变量 |
| E | Enclosing(嵌套) | 外层函数(闭包) | 嵌套函数的外层变量 |
| G | Global(全局) | 模块顶层 | 文件最外层定义的变量 |
| B | Built-in(内置) | Python 内置 | print、len、int |
一句话总结:变量查找顺序:L → E → G → B
二、逐一看懂每种作用域
1. Local(局部作用域 L)
函数内部定义的变量,只能在函数内部用。
def func():
x = 10 # 局部变量
print(x) # 可以访问
func() # 输出 10
print(x) # 报错!外部无法访问
2. Enclosing(嵌套作用域 E)
嵌套函数里,外层函数的变量。
def outer():
msg = "hello" # E 作用域
def inner():
print(msg) # 能访问外层函数的 msg
inner()
outer() # 输出 hello
3. Global(全局作用域 G)
整个文件顶层定义的变量,整个模块都能访问。
name = "小明" # 全局变量
def say_hello():
print(name) # 可以直接读取全局变量
say_hello() # 小明
⚠️ 注意:函数里想修改全局变量,必须加 global!不加会创建新的局部变量,不会修改全局变量。
count = 0
def add():
global count # 声明用全局变量
count += 1
add()
print(count) # 1
4. Built-in(内置作用域 B)
Python 自带的关键字、函数,任何地方都能用:print、len、list、str、sum 等。
三、最容易踩的坑
坑 1:函数内直接赋值 = 创建新局部变量
a = 100
def test():
a = 200 # 这里不是修改全局 a,而是创建了局部 a!
print(a)
test() # 200
print(a) # 100(全局没变)
坑 2:嵌套函数修改变量要用 nonlocal
def outer():
num = 10
def inner():
nonlocal num # 声明用外层函数变量
num = 20
inner()
print(num) # 20
outer()
四、一句话记住所有规则
LEGB:局部 → 嵌套外层 → 全局 → 内置
- 读变量:直接用
- 改全局:
global - 改嵌套外层:
nonlocal
总结
- Python 作用域遵循 LEGB 规则
- 局部变量只能在函数内访问
- 函数修改全局变量 →
global - 嵌套函数修改外层变量 →
nonlocal - 查找顺序永远是从内到外
更多推荐



所有评论(0)