Python中import是动态还是静态?模块全局变量是否共享?
关于Python模块全局变量共享的问题解答
嘿,这个问题问得很精准!答案是肯定的——你的主脚本和通过exec执行的子脚本,会共享同一个自定义模块里的全局变量,修改其中一处的变量值,另一处访问时会直接看到变化。
核心原因:Python模块的「单例加载机制」
Python里的模块是单例模式运行的:当你第一次导入某个模块时,Python会执行该模块的代码,创建一个对应的模块对象并缓存起来。之后不管在程序的哪个位置(哪怕是exec执行的脚本里)再次导入同一个模块,Python都不会重新执行模块代码,而是直接复用之前缓存的那个模块对象。
举个实际例子更直观
假设你的自定义模块叫shared_vars.py,内容是:
# shared_vars.py global_counter = 0
主脚本main.py的代码:
# main.py import shared_vars # 修改模块里的全局变量 shared_vars.global_counter += 1 print(f"主脚本修改后:global_counter = {shared_vars.global_counter}") # 输出:1 # 用exec执行子脚本 Seq_1 = "sub_script.py" exec(compile(open(Seq_1, "rb").read(), Seq_1, 'exec')) # 再次查看变量值 print(f"主脚本最后查看:global_counter = {shared_vars.global_counter}") # 输出:3
子脚本sub_script.py的代码:
# sub_script.py import shared_vars # 读取主脚本修改后的值 print(f"子脚本读取:global_counter = {shared_vars.global_counter}") # 输出:1 # 再次修改变量 shared_vars.global_counter += 2 print(f"子脚本修改后:global_counter = {shared_vars.global_counter}") # 输出:3
运行主脚本后,你会看到所有输出都是基于同一个global_counter变量的,完全共享。
注意区分:模块全局变量 vs 脚本自身全局变量
要特别注意:如果是在主脚本或子脚本里自己定义的全局变量(比如main.py里直接写x = 10),那这些变量属于各自的命名空间,不会互相影响。只有放在自定义模块里的全局变量,才会因为模块的单例特性被所有导入它的脚本共享。
内容的提问来源于stack exchange,提问作者AJT
相关产品推荐
相关产品推荐

