You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:46:55