【发布时间】:2014-01-03 12:59:43
【问题描述】:
我创建了一个 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's monkey patching?
【问题讨论】:
-
你引用了模块内的一个对象。该引用使该对象保持活动状态。
标签: python python-2.7 python-module python-internals