如何从导入模块修改Python主脚本(__name__=__main__)中的变量
如何从模块修改主脚本(name=main)中的变量值
问题背景
我有一个名为main.py的Python主脚本,以及一个名为module_1.py的模块,主脚本中导入了该模块。我需要在module_1.py中修改main.py里的变量x的值,为避免循环导入问题,我在module_1的pp()函数内导入main.py并设置main.x=12,但实际修改的是作为模块的main中的x,而非主脚本(name=main)里的x。
原代码与执行结果
main.py
import module_1 x = "45" module_1.pp() print(f"{__name__} : {x}")
module_1.py
def pp(): import main main.x = 12
执行结果
main : 12 __main__ : 45
问题原因
当直接运行main.py时,它会以__main__模块的身份被加载;而在module_1.py中import main时,Python会重新加载main.py并将其作为main模块实例化——这是两个完全独立的模块对象。因此你修改的是main模块里的x,而非主脚本__main__中的x。
解决方案
方法1:传递主脚本的命名空间
直接把主脚本的全局命名空间(通过globals()获取)传给模块函数,在函数内修改该命名空间中的变量:
修改后的main.py
import module_1 x = "45" module_1.pp(globals()) print(f"{__name__} : {x}")
修改后的module_1.py
def pp(namespace): namespace['x'] = 12
方法2:让函数返回新值,主脚本自行赋值
这种方式更符合模块化设计原则,避免直接修改外部命名空间:
修改后的main.py
import module_1 x = "45" x = module_1.pp(x) print(f"{__name__} : {x}")
修改后的module_1.py
def pp(current_x): # 可根据需求添加逻辑处理 return 12
方法3:用可变对象包装变量
利用Python中可变对象的引用特性,将变量放入列表、字典等可变容器中,修改容器内的元素即可影响主脚本中的值:
修改后的main.py
import module_1 x = ["45"] # 用列表包装字符串 module_1.pp(x) print(f"{__name__} : {x[0]}")
修改后的module_1.py
def pp(x_list): x_list[0] = 12
最终执行结果
上述三种方法执行后,都会输出:
__main__ : 12
内容的提问来源于stack exchange,提问作者starbit12
相关产品推荐
相关产品推荐

