当前位置: 首页 > 面试题库 >

Python:在其中的模块和类之间共享全局变量

曹泉
2023-03-14
问题内容

我知道可以在Python中的各个模块之间共享全局变量。但是,我想知道这种可能性的程度以及原因。例如,

global_mod.py

x = None

mid_access_mod.py

from global_mod import *

class delta:
    def __init__(self):
        print x

bot_modif_mod.py

import mid_access_mod
import global_mod

class mew:
    def __init__(self):
        global_mod.x = 5

def main():
    m = mew()
    d = mid_access_mod.delta()

即使所有模块都共享全局变量x,也将打印“无”。为什么会这样呢?似乎x是在mew()分配给bot_modif_mod.py之前在mid_access_mod.py求值的。


问题答案:

发生这种情况是因为您使用的是不可变值(int和None),并且导入变量就像按值传递事物,而不是按引用传递事物。

如果制作了global_mod.xa列表并操纵了它的第一个元素,则它将按预期工作。

完成后from global_mod import x,您将x在模块中创建一个名称,该名称的值与xin中的值相同global_mod。对于函数和类之类的东西,这可以按您期望的那样工作,因为人们(通常)以后不会重新分配这些名称。

正如Alex所指出的,如果您使用import global_mod,然后使用,则global_mod.x可以避免该问题。您在模块中定义的名称将为global_mod,它始终指向您想要的模块,然后使用属性访问获取atx将会为您提供最新值x



 类似资料:
  • 问题内容: 我只想在进程与该进程调用的dll之间共享静态/全局变量。exe和dll在相同的内存地址空间中。我不希望在其他进程之间共享该变量。 问题的阐述: 说是有一个静态/全局变量在。exe 和dll 都具有,因此变量都在两个图像中。 现在,动态加载(或静态)。然后,问题是该变量是否由exe和dll共享。 在Windows中,这两个家伙 永远不会 共享:exe和dll将具有的单独副本。但是,在Li

  • 问题内容: 假设我有一个要注入到config中的模块: 有两个子模块: 这是第一个: 第二个是相同的,以简化示例: 您会注意到,您可以将它们作为提供者来访问以配置选项: 如果我们在控制器中,则可以覆盖每个范围,例如: 但是,如果他们总是共享相同的财产怎么办?如何在提供商之间共享某些东西? 我可以同时为和注入和配置共享属性吗? 如何同时访问和作为单个模块的扩展? 问题答案: 将模块插入两个共享这些属

  • 问题内容: main.py: module.py 程序打印: 主要-之前:20 func2:20 func1:10 主-20点后 “ var”是全局变量。我希望当我更改var的值时,无论变量’var’出现在哪里,它都会被更改。func1和func2之间的唯一区别是func1在另一个模块中。仍然,我不明白为什么func1和func2之间的’var’值不同。 问题答案: python中没有真正的全局变

  • 问题内容: 我一周前开始用python进行编码,这是我的错误,我很快就开始使用oops,类和对象进行编码。我以为我的C ++水平会有所帮助…。 令我惊讶的是,var和list都是一个全局变量,似乎在所有实例中都共享....我以为在所有实例中它都不同.....我花了半天的时间才弄清楚那....一点意义都没有,一个变量只能由一个类对象访问,而是在所有实例之间共享....只是好奇,它背后有原因吗???

  • 问题内容: 我有一个多模块的Maven项目。为了这个示例,请考虑两个模块: 模块将模块作为依赖项。 模块声明了一堆核心类。有使用它们的测试。这些测试需要创建一些冗长的对象,因此我有一个带有一些实用程序方法的类来创建这些对象。实用程序类()在层次结构中。 我在模块中也进行了一些测试,这些测试需要创建一些冗长的对象。我想在我的树中的测试中使用我的类(在中定义)。不幸的是,即使是的依赖项,也无法看到存在

  • 我有一个多模块Maven项目。在本例中,考虑两个模块: 模块具有模块作为依赖项。 为了解决这个问题,我想我可以创建另一个模块(),并将移到下。那么我将包含作为的测试范围依赖项。不幸的是,这引入了循环依赖关系:使用,但还需要。 我想出的唯一解决方案是将放在下,放在包下,希望真正的应用程序代码不会调用它。 如何在模块之间共享我的类,而不将其放在下?