2020年1月5日 / 67次阅读 / Last Modified 2020年1月5日
在分析设计程序和debug的时候,有个细节要注意,程序运行时,python解释器中同一个模块,只有一份copy。不管在多少个不同的模块中import了一个相同的模块,这些不同的模块访问的都是同一个地址同一个模块。
这样,就带来了一个设计上的细节,像C语言一样,我们可以通过某个模块中的全局变量,来控制这个模块的运行方式,而对这个模块全部变量的修改,会在全局生效!
python这样设计是合理的,不需要为相同的模块代码创建不同的内存空间!节省内存,也加快import的速度。
下面这段测试代码,说明了本文的主题,import的模块,在python解释器中,只有一份copy。
$ cat a.py
import b
import c
b.sing = 123
c.p_sing()
print(id(b))
print(id(c.b))
$ cat b.py
sing = 0
$ cat c.py
import b
def p_sing():
print(b.sing)
b模块只有一个全局变量sing,默认值为0。a作为程序入门,import b,然后将b.sing修改为123。a还import了c,调用c的p_sing函数。c模块也有import b,p_sing的功能就是打印b.sing这个全局变量。最后再a中打印出模块b的地址。下面是执行结果:
$ python3 a.py
123
140346404006472
140346404006472
b.sing的值被a模块中的代码成功修改,在c模块的代码中打印出来,a.b和c.b的地址一样!
-- EOF --
本文链接:https://www.pynote.net/archives/1730
©Copyright 麦新杰 Since 2019 Python笔记