我看到还有其他与交叉模块变量相关的问题,但它们并没有完全回答我的问题。
我有一个应用程序,我已经拆分为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未定义”
答案 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 a
或import a.a as aa
或其他)或将模块a
中的变量复制到main
。
请注意,只为每个值创建一个新名称;它没有引用变量。在Python中没有对变量的引用。
如果变量保持常量,或者它们包含您修改的可变值,则此方法有效。如果变量是要重新绑定到新值的名称,则它不会执行任何有用的操作。 (如果你确实需要这样做,只需将值包装在可变的内容中 - 例如,将每个变量转换为1项列表,这样你就可以重新绑定a[0]
而不是a
,这意味着其他人谁引用a
可以看到您的新a[0]
值。)
如果你坚持“真正的全球化”,即使这并非不可能。有关详细信息,请参阅builtins
。但你几乎肯定不想要这个。