Python使用from x import *导入后修改原模块全局变量的方案咨询
Python跨模块修改全局变量同步的可行方案
方案1:将状态封装到可变容器中
Python中from import *导入不可变类型变量时,本质是在当前模块新建了同名变量指向原对象,原模块对变量名重新赋值时不会同步到导入侧。如果把状态放到列表、字典这类可变容器中,导入的是容器的引用,修改容器内部内容两边会同步,同时完全兼容__all__导出控制:
原模块代码示例:
__all__ = ["app_state", "foo"] # 用字典存储可变状态 app_state = { "test": True } def foo(): app_state["test"] = not app_state["test"]
导入侧使用方式:
from your_module import * print(app_state["test"]) # 输出 True foo() print(app_state["test"]) # 输出 False,已同步修改
方案2:封装getter接口(更推荐)
遵循封装原则,不直接导出内部变量,而是提供取值接口,同时可以用下划线约定内部变量避免被意外导出,完美匹配你控制公开访问范围的需求:
原模块代码示例:
__all__ = ["foo", "get_test"] # 下划线开头的变量不会被`from import *`自动导入 _test = True def foo(): global _test _test = not _test def get_test(): return _test
导入侧使用方式:
from your_module import * print(get_test()) # 输出 True foo() print(get_test()) # 输出 False,可获取最新值
方案说明
两种方案都不需要你通过import 模块名的方式访问,完全兼容__all__的导出控制规则。其中方案2的封装性更好,不会暴露内部状态的存储细节,后续调整内部实现也不会影响使用侧的代码。
内容的提问来源于stack exchange,提问作者Zolak
相关产品推荐
相关产品推荐

