Python跨模块变量和导入

Python跨模块变量和导入,python,Python,我看到还有其他与跨模块变量相关的问题,但它们并没有完全回答我的问题 我有一个应用程序,我已经分为3个模块+1个主应用程序,主要是为了便于可读性和可维护性 其中2个模块的线程带有需要从其他模块和其他模块线程修改的变量 虽然我可以从主代码中修改模块的变量,但我似乎无法从另一个模块中修改一个模块的变量,除非我将每个模块导入到其他模块中 下面的示例中,a&b被导入到main中,模块a需要访问模块b中的变量: main module a var a module b var a main

我看到还有其他与跨模块变量相关的问题,但它们并没有完全回答我的问题

我有一个应用程序,我已经分为3个模块+1个主应用程序,主要是为了便于可读性和可维护性

其中2个模块的线程带有需要从其他模块和其他模块线程修改的变量

虽然我可以从主代码中修改模块的变量,但我似乎无法从另一个模块中修改一个模块的变量,除非我将每个模块导入到其他模块中

下面的示例中,a&b被导入到main中,模块a需要访问模块b中的变量:

main
 module a
   var a
 module b
   var a

main
 a.a = 1
 b.a = 2

module a
 b.a = 3

module b
 a.a = 0
如果不将模块a导入模块b,也不将模块b导入模块a,是否可以通过主程序全局实现这一点

如果我必须将a和b导入main,然后将a导入b和b导入a,那么在内存和资源使用/速度等方面会有什么影响

我尝试了@abarnert的建议:

#moda
vara = 10

#modb
print(str(vara))

#main
import moda
from moda import vara
import modb

但是,我得到“名称错误vara未定义”

如果您希望能够从不同的模块修改模块级变量,则需要导入其他模块。我会问你为什么要这样做。也许您应该将代码分解为类,而不是单独的模块

例如,您可以选择将两个模块都需要修改的变量封装在一个单独的类中,并将该类的单个实例传递给所有需要它的类(或模块,但您应该真正使用类)


有关周期性导入的更多信息,请参阅。

如果模块中的代码定义为类,并且主程序创建这些类的实例,则主程序可以将一个模块类的实例传递给另一个模块类,对该实例的更改将反映在所有地方。不需要将a或b导入彼此,因为它们只是相互引用

如果我必须将a和b导入main,然后将a导入b和b导入a,那么在内存和资源使用/速度等方面会有什么影响

绝对无内存导入
a
的每个模块都将获得对完全相同的
a
模块对象的引用。您所做的只是增加其参照数,而不是创建新对象

为了提高速度,发现您正试图导入一个已经存在的模块的时间几乎为零(只需在字典中查找模块名称)。访问
a.a
比只访问
a
稍微慢一点。但这很少是一个问题。如果是的话,几乎可以肯定的是,你会想把这个值复制到任何函数的局部变量中,在这个时候,不管它来自哪个全局变量

如果不将模块a导入模块b,也不将模块b导入模块a,是否可以通过主程序全局实现这一点

当然。您所要做的就是导入(使用
从导入a
将a.a导入为aa
或任何东西)或将变量从模块
a
复制到
main

请注意,只需为每个值创建一个新名称;它不引用变量。Python中没有对变量的引用

如果变量包含常量,或者如果它们包含您修改的可变值,则此操作有效。如果变量是要重新绑定到新值的名称,那么它就没有任何用处。(如果您确实需要这样做,只需将值包装在一些可变的东西中,例如,将每个变量转换为一个1项列表,这样您就可以重新绑定
a[0]
,而不是
a
,这意味着有
a
引用的任何其他人都可以看到新的
a[0]
值。)


如果你坚持要一个“真正的全球”,那也不是不可能的。有关详细信息,请参阅。但您几乎肯定不希望这样。

作为旁注,您几乎肯定不希望将a导入b和b导入a,因为循环导入是痛苦的。您要做的是将构成
b
使用的“接口”的
a
部分与构成使用
b
的“实现”部分分开。通常,这只是获取一组常量或标志/设置变量或单例对象,并将它们移动到单独的模块中。