2

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

我有一个应用程序,我将其拆分为 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

但是我得到“名称错误变量未定义”

4

3 回答 3

1

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

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

有关循环导入的更多信息,请参阅Python 中的循环(或循环)导入。

于 2013-11-08T02:13:42.590 回答
1

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

于 2013-11-08T02:14:21.610 回答
1

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

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

为了速度,发现您正在尝试导入一个已经存在的模块的时间几乎没有(它只是在字典中查找模块名称)。访问a.a仅访问a要慢一些。但这很少是一个问题。如果是这样,您几乎肯定会想要将该值复制到一遍又一遍地访问它的任何函数的局部变量中,此时它来自哪个全局变量并不重要。

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

当然。您所要做的就是导入(使用from a import aimport a.a as aa其他方式)或将变量从模块复制amain.

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

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

如果你坚持“真正的全球”,那也不是不可能的。详情请参阅builtins。但你几乎肯定不想要这个。

于 2013-11-08T02:16:18.053 回答