Python交叉模块变量和导入

时间:2013-11-08 01:57:56

标签: python

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

我有一个应用程序,我已经拆分为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导入a,那么在内存和资源使用/速度方面有什么影响?

我尝试了@abarnert的建议:

#moda
vara = 10

#modb
print(str(vara))

#main
import moda
from moda import vara
import modb

然而我得到“名称错误vara未定义”

3 个答案:

答案 0 :(得分:1)

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

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

有关周期性导入的详细信息,请参阅Circular (or cyclic) imports in Python

答案 1 :(得分:1)

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

答案 2 :(得分:1)

  

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

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

对于速度,发现您尝试导入已存在的模块的时间几乎没有(它只是在字典中查找模块名称)。访问a.a 稍微慢于访问a。但这很少是一个问题。如果是这样,你几乎肯定会想要将该值复制到任何函数正在反复访问它的本地中,此时它来自哪个全局变量无关紧要。

  

不将模块a导入模块b并将模块b导入模块a,这可以通过主程序全局实现吗?

不确定。您所要做的就是导入(使用from a import aimport a.a as aa或其他)或将模块a中的变量复制到main

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

如果变量保持常量,或者它们包含您修改的可变值,则此方法有效。如果变量是要重新绑定到新值的名称,则它不会执行任何有用的操作。 (如果你确实需要这样做,只需将值包装在可变的内容中 - 例如,将每个变量转换为1项列表,这样你就可以重新绑定a[0]而不是a,这意味着其他人谁引用a可以看到您的新a[0]值。)

如果你坚持“真正的全球化”,即使这并非不可能。有关详细信息,请参阅builtins。但你几乎肯定不想要这个。