一尘不染

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

python

我知道可以在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求值的。


阅读 172

收藏
2020-12-20

共1个答案

一尘不染

发生这种情况是因为您使用的是不可变值(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

2020-12-20