两者之间确实有区别
from mymodule import obj
(...)
do_something_with(obj)
和
import mymodule
(...)
do_something_with(mymodule.obj)
在第一种情况下,它的作用是:
import mymodule
obj = mymodule.obj
del mymodule
这意味着,在这一点上,目前的模块中,obj
是一个“全球性”(这在Python实际上意味着“模块级”,而不是“应用程序范围”)的名字必将无论mymodule.obj
是当它被导入 (以你的情况:None
)。从那时起,mymodule.obj
模块本地obj
名称生活在不同的命名空间中(第一个在mymodule
命名空间中,第二个在当前模块命名空间中),并且mymodule.obj
从任何地方重新绑定都不会改变当前模块obj
所绑定的内容。实际上,这就像您在执行此操作一样:
a = 2
b = a
a = 4
第三条语句之后,b
显然仍势必2
-重新绑定a
到4
不影响b
。
在第二种情况(import mymodule
)中,导入模块的名称空间中绑定的是整个mymodule
对象,因此,如果发生mymodule.obj
反弹(从内部mymodule
或其他任何地方),则更改将在导入模块中可见。在这种情况下,它相当于
a = {"x": 2}
b = a
a["x"] = 4
在这种情况下,更改也将可见,b["x"]
因为a
并且b
仍然绑定到同一对象。
wrt /您的另一个问题:是的,拥有一些“ config”对象是很常见的模式。您可能只想确保您也可以“从头开始”构建它(我的意思是,不一定从配置文件构建),以使单元测试更加容易。