仅在需要时初始化Python模块。您是否可以利用这一事实以这种方式在模块之间共享状态:
# a.py
import random
state = { 'foo' : random.random() }
# b.py
from a import state
# c.py
from a import state
当b和c在同一个进程中运行时,假设b和c中的'state'总是引用同一个实例是否安全?
答案 0 :(得分:3)
扩展/澄清C1phr的答案:
只要a,b和c都没有为state
分配新值,三个模块中的 state
将引用同一个对象。如果三个模块中的任何一个state = <something else>
,它将不同步。模块可以安全地改变值(例如,通过执行state['blah'] = 'stuff'
),而不是分配新值。
正如C1phr所说,你可以通过总是通过包含它的模块引用变量来防范这种情况,如a.state
(来自b
和c
)。
理论上有一些方法可以重新加载一个模块,从而使变量不同步,但这些方法并不常见或不合需要。例如,显然如果有人reload(a)
,那么a
将被重新加载,而b和c将不知道这一点。但这是一件不寻常的事情。此外,模块可能是imported twice via different paths,如果您没有跟踪这两个版本,这可能会使变量似乎不同步。但是以这种方式两次导入相同的模块无论如何都是一个错误。
答案 1 :(得分:1)
由于Python在导入时对变量和函数的处理方式相同,这将起作用,但变量将被复制到新的命名空间中。这样就可以了,直到你想要改变state的值,这只会反映在你进行更改的命名空间中。如果你想拥有读写权限,那么你最好用:
import a
然后使用
访问变量MY_VAR = a.state
并使用
进行设置a.state = MY_NEW_STATE