2014-10-09 37 views
1

我很困惑,如果你将模块作为单例使用,会发生什么。导入如何用作单例使用的模块?

说我有一个模块conf.py,其中包含一些配置参数,需要由多个其他文件访问。在conf.py,我可能有这样的一段代码(没有别的):

myOption = 'foo' + 'bar' 

如果我现在在a.py先导入它,然后在b.py,我的理解是,第一次它被导入(在a.py中),字符串连接将被执行。但是第二次导入时(在b.py中),conf.myOption已经有了它的值,所以不会执行字符串连接。它是否正确?

如果做这两个进口后,我再执行在b.py

conf.myOption = 'aDifferentFoobar' 

以下则显然b.py现在会看到这个新的价值。 a.py会看到相同的值,还是会看到'foobar'?

我相信(但纠正我,如果我错了),进口总是引用参考,而不是价值?我猜这就是以上问题归结到的。

+2

好问题,但没有你试试吧;) – 2014-10-09 09:53:10

+0

好点,但我还是有点担心可能有角的情况下是不明显... – funklute 2014-10-09 10:20:02

回答

1

试试看:

mod.py

def foo(): 
    print("in foo()") 
    return "foo" 

bar = foo() 
opt = "initial" 

b.py

import mod 

mod.opt = "changed" 

a.py

import mod 
import b 

print(mod.bar) 
print(mod.opt) 

执行a.py

$ python3.4 a.py 

输出:

in foo() 
foo 
changed 

我们学习:

  • foo()只执行一次
  • mod.optb.py
  • a.py变化看到了改变的值mod.opt
  • 奖金:中import S IN a.py的顺序并不重要