发布于2026-06-24 阅读(0)
扫一扫,手机访问
在 Python 包里做跨模块的变量共享,说起来简单,但一不留神就容易踩坑。很多人的第一反应是在 __init__.py 里用 global 声明一个变量,结果发现子模块里根本拿不到——原因很简单:每个模块都有自己的独立命名空间,global 管不了隔壁家的事。

正确做法是把共享变量定义为包的顶层模块属性,通过 __init__.py 统一导出和管理。这样既明确了变量的归属,又提供了统一的访问入口,结构上清晰自然,也符合 Python 的常规惯例。
第一步,在包的主 __init__.py 里定义一个占位变量和一个显式初始化函数:
# my_package/__init__.py
x = None # 占位符,表示未初始化;也可设为默认值(如 x = 0)
def init(initial_value):
"""显式初始化共享变量 x"""
global x
x = initial_value第二步,子模块通过包名访问这个变量(推荐用绝对导入,更清晰):
# my_package/subpackage/my_function.py
import my_package
def my_function():
if my_package.x is None:
raise RuntimeError("my_package.init() must be called before using this function")
print(f"Using shared value: {my_package.x}")
return my_package.x * 2当然,也可以用相对导入:
# my_package/subpackage/my_function.py
from .. import x
def my_function():
if x is None:
raise RuntimeError("my_package.init() must be called before using this function")
print(f"Using shared value: {x}")
return x * 2第三步,在主程序中按顺序先初始化,再使用:
import my_package my_package.init(1234) result = my_package.subpackage.my_function() # 输出: Using shared value: 1234 → 返回 2468
__init__.py 里直接执行 init(42)——那样包被导入就会初始化,失去了控制权。from my_package import x 之后再修改 x,那只是改了一个本地别名,包内的原始变量纹丝不动。@property 或 types.SimpleNamespace 封装一下。说到底,Python 包的“全局变量”本质上就是包模块的属性。通过 import my_package 拿到它的命名空间,读写 my_package.x 就顺理成章了。配合一个显式的 init() 函数,初始化意图一目了然,跨模块安全共享也就成了常规操作。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8