精通Python global关键字:用法、时机与最佳实践
精通Python global关键字:用法、时机与最佳实践
本指南解释Python global 关键字、其规则、实战用例及跨模块管理全局变量的最佳实践。
什么是global关键字?
Python中,global 关键字声明函数内变量指向模块级变量而非新建局部变量。当函数需读写其自身作用域外的变量时必不可少。
global 使用规则
- 函数内创建的变量默认为局部。
- 模块级定义的变量自动为全局;仅读取时无需
global。 - 函数内打算给模块级变量赋值时使用
global。 - 函数外放置
global无效果。
global 实战用法
以下示例演示陷阱与正确做法。
示例 1:从函数内访问全局变量
c = 1 # 全局变量
def add():
print(c)
add()
输出:
1
此处 c 成功读取,因 add() 内无赋值。
示例 2:未用 global 尝试修改全局变量
c = 1 # 全局变量
def add():
c = c + 2 # 尝试修改c
print(c)
add()
输出:
UnboundLocalError: local variable 'c' referenced before assignment
错误因Python将 c 视为新局部变量,却在赋值前引用。
示例 3:用 global 修改全局变量
c = 0 # 全局变量
def add():
global c
c = c + 2
print("Inside add():", c)
add()
print("In main:", c)
输出:
Inside add(): 2 In main: 2
声明 global c 后,函数更新模块级 c,变更在函数外可见。
跨模块共享全局变量
大型应用常将配置集中在专用模块如 config.py。其他模块导入并修改这些值,实现程序间一致状态。
示例 4:跨模块全局变量
创建 config.py:
a = 0
b = "empty"
创建 update.py 修改全局:
import config
config.a = 10
config.b = "alphabet"
创建 main.py 验证变更:
import config
import update
print(config.a)
print(config.b)
输出:
10 alphabet
此模式将共享状态集中一处,允许其他模块受控更新。
嵌套函数中使用 global
嵌套函数需修改外层函数局部变量时,仍可用 global 创建真正全局变量。
示例 5:嵌套函数中的全局变量
def foo():
x = 20
def bar():
global x
x = 25
print("Before calling bar:", x)
print("Calling bar now")
bar()
print("After calling bar:", x)
foo()
print("x in main:", x)
输出:
Before calling bar: 20 Calling bar now After calling bar: 20 x in main: 25
foo() 内 x 仍为局部变量。嵌套 bar() 声明 x 为全局,故赋值影响模块级 x,在 foo() 结束后可见。
虽 global 方便,但通常最好设计返回新值的函数而非修改全局状态。这促进代码更清晰、易测试。详细语言规则见官方文档 global语句。
Python