在Python包中实现跨模块变量共享,应将变量定义为__init__.py的顶层属性,通过显式初始化函数设置,子模块以包名绝对导入访问。避免直接修改导入的别名或自动初始化,确保控制权清晰。
__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() 函数,初始化意图一目了然,跨模块安全共享也就成为常规操作。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述