我用一个函数创建了一个 Python 模块,它只打印“a!”。我打开了 Python 解释器并以 2 种不同的语法导入了模块
>>> import a
>>> from a import func
>>> func()
a!
>>> a.func()
a!
此时我将 func 更改为打印其他内容,然后再次评估
>>> func()
a!
>>> a.func()
a!
这当然是意料之中的,因为模块没有重新加载。然后我重新加载了模块并希望这两个函数都能更新,但是:
>>> reload(a)
<module 'a' from 'a.py'>
>>> a.func()
aasd!
>>> func()
a!
只有 a.func 似乎更新了。我一直认为 Python 只保留同一个模块的一个实例,但现在似乎有两个。为了验证我的声明,我做了进一步的测试,并在模块的顶层添加了一个打印语句,然后重新启动解释器并再次导入:
>>> import a
module imported
>>> import a
>>> from a import func
这让我更加困惑,因为我预计会看到两次“导入的模块”。我做的第三个实验是全局变量实验:
>>> import a
module imported
>>> from a import GLOBAL_VAR
>>> GLOBAL_VAR = 5
>>> a.GLOBAL_VAR
1
>>> GLOBAL_VAR
5
>>> GLOBAL_VAR is a.GLOBAL_VAR
False
所以模块只有一个实例,但里面的对象有不同的实例?如何用这种行为实现Gevent 的猴子补丁?