我知道在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中计算的。
我修改了示例以使用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
的最新值。相关问题 更多 >
编程相关推荐