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

2024-06-02 04:41:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道在Python中跨模块共享全局变量是可能的。不过,我想知道这在多大程度上是可能的,为什么。例如

全球_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中计算的。


Tags: 模块pyimportselfmodaccessinitdef
3条回答

我修改了示例以使用x的list,list赋值(x[0]=…)如前一个答案中所建议的,并且打印返回相同的初始值(无)…这验证了“from global_mod import*”是一个副本,而不管是否可变。

如注释“import global_mod”所示,如果“print global_mod.x=在mid_access_mod中使用。

from whatever import *而不是在代码中使用的一个好习惯用法——它是为了在交互式会话中(如果有的话)用作保存某些类型的快捷方式。它基本上是“快照”模块中的所有名称--如果您重新绑定其中任何一个名称,快照将变得陈旧,所有类型的问题都将随之而来。而这仅仅是通过使用糟糕的from ... import *结构注册的不可解决的混乱的开始。

想听听我的建议吗?忘记你曾经听说过存在的构造,永远不要再使用它。使用import global_mod as m并始终在此后使用限定名,例如m.x——限定名在Python中比仅使用裸名更方便、更强大,甚至不好玩。(import语句的as m部分是完全可选的,基本上是为了简洁起见而存在的,或者有时是为了解决与名称冲突有关的一些问题;在您觉得方便的时候使用它,因为它没有缺点,但如果您觉得不必要,也不要感到被迫使用它,甚至不要敦促使用它)。

这是因为您使用的是不可变的值(ints和None),导入变量就像是按值传递内容,而不是按引用传递内容。

如果您将global_mod.x列为一个列表,并操纵它的第一个元素,它将按您的预期工作。

当您执行from global_mod import x时,您正在模块中创建一个名x,其值与global_mod中的值相同。对于函数和类之类的东西,这就像您所期望的那样工作,因为人们(通常)不会在以后重新分配这些名称。

正如Alex指出的,如果使用import global_mod,然后使用global_mod.x,就可以避免这个问题。您在模块中定义的名称将是global_mod,它总是引用您想要的模块,然后使用属性访问获取x将获得x的最新值。

相关问题 更多 >