Python 函数与模块化编程:局部变量与全局变量的深度解析
·
在 Python 编程中,变量的作用域(局部 / 全局)是函数与模块化开发的核心基础,直接影响代码的可读性、可维护性和执行逻辑。本文从作用域规则、变量交互方式、常见陷阱及模块化场景下的最佳实践展开,结合实战示例深度解析局部与全局变量的核心知识点。
一、核心概念:作用域与变量分类
1.1 变量作用域的定义
变量的作用域指 “变量能被访问 / 修改的代码范围”,Python 中最核心的两类作用域对应局部变量和全局变量:
| 类型 | 定义场景 | 访问范围 | 生命周期 |
|---|---|---|---|
| 全局变量 | 函数 / 类外部定义 | 整个程序(所有函数 / 模块均可访问) | 程序启动至结束 |
| 局部变量 | 函数 / 类方法 / 代码块内部 | 仅定义它的函数 / 代码块内部 | 函数调用时创建,调用结束销毁 |
1.2 作用域的底层规则:LEGB 原则
Python 解析变量时遵循LEGB 优先级顺序,从内到外查找:
- L(Local):当前函数 / 代码块的局部作用域;
- E(Enclosing):嵌套函数中的外层(闭包)作用域;
- G(Global):模块级的全局作用域;
- B(Built-in):Python 内置的关键字 / 函数(如
print/len)。
示例:LEGB 规则验证
python
# G(全局)
global_var = "全局变量"
def outer_func():
# E(闭包外层)
enclosing_var = "闭包变量"
def inner_func():
# L(局部)
local_var = "局部变量"
# 查找顺序:local → enclosing → global → built-in
print(local_var) # 局部变量(L)
print(enclosing_var)# 闭包变量(E)
print(global_var) # 全局变量(G)
print(len) # 内置函数(B)
inner_func()
outer_func()
二、局部变量:函数内的 “私有” 变量
2.1 局部变量的特性
- 自动创建与销毁:函数调用时分配内存,调用结束后立即释放,不占用全局资源;
- 作用域隔离:不同函数的局部变量相互独立,同名变量不会冲突;
- 优先级最高:函数内若定义了与全局变量同名的局部变量,优先使用局部版本。
示例:局部变量的隔离性
python
def func1():
num = 10 # func1的局部变量
print(num) # 输出:10
def func2():
num = 20 # func2的局部变量(与func1同名但不冲突)
print(num) # 输出:20
func1()
func2()
2.2 局部变量的限制
- 局部变量无法被函数外部访问;
- 函数内默认无法修改全局变量(直接赋值会被识别为 “创建局部变量”)。
错误示例:函数内误改全局变量
python
count = 0 # 全局变量
def add_count():
count += 1 # 报错:UnboundLocalError(Python认为count是局部变量,但未定义)
print(count)
add_count()
三、全局变量:跨函数的 “公共” 变量
3.1 全局变量的定义与访问
全局变量定义在所有函数外部,可被程序内所有函数直接读取(无需额外声明)。
示例:全局变量的读取
python
# 全局变量
PI = 3.14159
user_name = "Pythoner"
def calculate_circle(r):
# 直接访问全局变量PI
return PI * r * r
def print_info():
# 直接访问全局变量user_name
print(f"用户名:{user_name}")
print(calculate_circle(2)) # 输出:12.56636
print_info() # 输出:用户名:Pythoner
3.2 全局变量的修改:global关键字
若需在函数内修改全局变量(而非创建局部变量),需用global声明变量为 “全局变量”。
正确示例:用global修改全局变量
python
count = 0 # 全局变量
def add_count():
global count # 声明:使用的是全局变量count
count += 1
print(count) # 输出:1
add_count()
print(count) # 输出:1(全局变量已被修改)
3.3 global关键字的使用规则
global声明需放在函数内变量使用之前;- 可同时声明多个全局变量:
global a, b, c; global仅作用于当前函数,嵌套函数需单独声明。
更多推荐


所有评论(0)