导入封闭命名空间时全局变量修改丢失问题咨询
Python自导入的命名空间隔离问题
代码示例
a = 0 def func(): import new_script # 自导入自身 new_script.a += 1 print(new_script.a) func() print(a)
执行输出
1 1 2 0
原因解析
直接运行的脚本和导入的模块是两个完全独立的命名空间,具体执行流程如下:
- 当你用
python new_script.py启动脚本时,它会以__main__模块身份执行:- 定义
__main__.a = 0,定义func(),然后调用func()。
- 定义
- 进入
__main__.func(),执行import new_script:- Python加载全新的
new_script模块实例,执行其顶层代码:- 定义
new_script.a = 0,定义new_script.func(),然后调用new_script.func()。
- 定义
- Python加载全新的
- 进入
new_script.func():- 此时
new_script模块已加载,直接引用现有对象,将new_script.a递增到1并打印(第一个输出1)。 - 函数返回后,
new_script模块顶层执行print(a),这里的a是new_script.a,打印第二个1。
- 此时
- 回到
__main__.func():- 引用已加载的
new_script模块,将new_script.a递增到2并打印(第三个输出2)。
- 引用已加载的
- 回到
__main__模块顶层,执行print(a):- 这里的
a是__main__.a,从始至终未被修改,所以输出0。
- 这里的
内容的提问来源于stack exchange,提问作者Tortar
相关产品推荐
相关产品推荐

