Python 变量作用域
理解 LEGB 规则:Local/Enclosing/Global/Built-in · 难度:进阶 · +15XP
Python 变量作用域
变量作用域决定了在程序的哪些位置可以访问某个变量。理解作用域对于编写清晰的 Python 代码至关重要。Python 使用 LEGB 规则来确定变量查找顺序:Local(局部)、Enclosing(闭包)、Global(全局)、Built-in(内置)。
局部作用域 (Local)
在函数内部定义的变量属于局部作用域,只能在函数内部访问:
def my_function():
local_var = '我是局部变量'
print(local_var) # 可以访问
my_function()
# print(local_var) # NameError! 外部无法访问
全局作用域 (Global)
在函数外部定义的变量属于全局作用域。但在函数内部修改全局变量需要使用 global 关键字:
global_var = '我是全局变量'
def read_global():
print(global_var) # 读取全局变量(不需要 global)
def modify_global():
global global_var # 声明要修改全局变量
global_var = '已被修改'
print(global_var)
read_global() # 我是全局变量
modify_global() # 已被修改
print(global_var) # 已被修改
闭包作用域 (Enclosing)
嵌套函数中,内层函数可以访问外层函数的变量。使用 nonlocal 关键字可以在内层函数中修改外层函数的变量:
def outer():
outer_var = '外层变量'
def inner():
nonlocal outer_var # 声明使用外层变量
outer_var = '被内层修改'
print(outer_var)
inner()
print(outer_var)
outer()
# 输出:
# 被内层修改
# 被内层修改
LEGB 查找规则示例
# Built-in (内置)
print # <built-in function print>
# Global (全局)
x = 'global'
def outer():
# Enclosing (闭包)
x = 'enclosing'
def inner():
# Local (局部)
x = 'local'
print(x) # 输出: local
inner()
print(x) # 输出: enclosing
outer()
print(x) # 输出: global
LEGB 规则速查表
| 作用域 | 缩写 | 说明 | 修改关键字 |
|---|---|---|---|
| 局部 (Local) | L | 函数内部定义的变量 | 无需 |
| 闭包 (Enclosing) | E | 外层函数中定义的变量 | nonlocal |
| 全局 (Global) | G | 模块级别定义的变量 | global |
| 内置 (Built-in) | B | Python 内置的名字 | 不建议修改 |