Python 作用域与命名空间:全局/局部变量及 LEGB 规则解析
背景:全局变量带来的安全隐患
来看一段代码示例:
# config.py
DB_HOST = "192.168.1.10"
DB_PORT = 54321
DB_USER = "app_user"
DB_PASSWORD = "secret123"
def connect_to_db():
return psycopg2.connect(
host=DB_HOST,
port=DB_PORT,
user=DB_USER,
password=DB_PASSWORD
)
潜在风险:
- 密码暴露在全局命名空间,任何模块
import config都能读取 - 多线程环境下,若有人临时修改了
DB_PASSWORD,整个进程可能受影响 - 单元测试时,难以 Mock 不同环境的配置
这背后,就是 作用域(Scope)和命名空间(Namespace) 的概念需要理清。
一、LEGB 是什么?
LEGB 是 Python 查找变量的顺序:
- Local(局部) → 函数内部
- Enclosing(嵌套) → 外层函数(闭包)
- Global(全局) → 模块顶层
- Built-in(内置) →
len,print等
示例:
name = "全局张三" # Global
def outer():
name = "外层李四" # Enclosing
def inner():
name = "局部王五" # Local
print(name)
inner()
outer()
Python 会从内往外找:先看 inner() 里有没有 name,有就用;没有再看 outer(),再没有才看全局。
核心原则:'就近原则,层层向外'
二、全局变量:合理使用需谨慎
很多开发者习惯把配置全扔全局:
# ❌ 潜在风险示范
DB_CONFIG = {
: ,
: ,
: ,
:
}
():
psycopg2.connect(**DB_CONFIG)

