python的作用域
在 Python 中,变量的作用域遵循 LEGB 规则,即变量查找顺序从内到外依次为:Local(本地)→ Enclosing(被嵌入的本地)→ Global(全局)→ Built-in(内置)。以下是对每个作用域的详细解释及示例:
1. 本地作用域(Local Scope)
- 定义:当前函数或方法内部的变量。
- 特点:
- 变量在函数内定义(使用
=赋值或def定义新函数)。 - 仅在函数执行期间存在,函数结束后销毁。
- 变量在函数内定义(使用
- 示例:
def my_func(): x = 10 # 本地作用域变量 print(x) # 输出 10 my_func() # print(x) # 报错!x 已销毁
2. 被嵌入的本地作用域(Enclosing Scope)
-
定义:嵌套函数中,外层函数的作用域。
-
特点:
- 仅存在于嵌套函数结构中。
- 内部函数可以读取或修改外层函数的变量(需使用
nonlocal关键字)。
-
示例:
def outer(): x = "enclosing" # Enclosing 作用域变量 def inner(): print(x) # 读取外层变量 → 输出 "enclosing" inner() outer() -
使用
nonlocal修改外层变量:def outer(): x = 10 def inner(): nonlocal x x = 20 # 修改 Enclosing 作用域的 x inner() print(x) # 输出 20 outer()
3. 全局作用域(Global Scope)
-
定义:模块(文件)级别的变量,在函数外定义。
-
特点:
- 全局变量在程序启动时创建,程序结束后销毁。
- 函数内默认只能读取全局变量,修改需使用
global关键字。
-
示例:
x = "global" # 全局作用域变量 def my_func(): print(x) # 读取全局变量 → 输出 "global" my_func() -
使用
global修改全局变量:x = 10 def modify_global(): global x x = 20 # 修改全局变量 modify_global() print(x) # 输出 20
4. 内置作用域(Built-in Scope)
- 定义:Python 内置的预定义变量和函数(如
len,print,str等)。 - 特点:
- 在所有作用域中自动可用。
- 可被局部或全局作用域的同名变量覆盖。
- 示例:
# 正常使用内置函数 print(len("hello")) # 输出 5 # 覆盖内置函数 def my_func(): len = 10 # 本地作用域覆盖内置 len print(len) # 输出 10 my_func() print(len("test")) # 正常输出 4(全局作用域未覆盖)
作用域查找顺序(LEGB 规则)
当访问一个变量时,Python 按以下顺序查找:
- Local → 当前函数内。
- Enclosing → 外层嵌套函数内(如果存在)。
- Global → 模块级别。
- Built-in → Python 内置作用域。
若未找到,则抛出 NameError。
示例:
x = "global"
def outer():
x = "enclosing"
def inner():
x = "local"
print(x) # 输出 "local"(Local)
print(str) # 输出 <class 'str'>(Built-in)
inner()
outer()
print(x) # 输出 "global"(Global)
关键注意事项
- 避免变量覆盖:慎用与内置函数同名的变量(如
list = [1, 2])。 - 显式声明:修改全局或 Enclosing 变量时需使用
global或nonlocal。 - 作用域隔离:函数内的变量默认独立于外部(除非显式引用)。
理解作用域规则能有效管理变量生命周期,避免命名冲突和逻辑错误。

浙公网安备 33010602011771号