如何在Python中设置动态全局变量?

时间:2012-10-29 09:40:44

标签: python

假设我有一个文件a.pya有一个变量var

在文件b.py中,我导入了a.py并设置了a.var = "hello"

然后我在a.py中导入c.py并尝试访问a.var,但我得到了None

如何反映数据的变化?很明显,有两个不同的实例被调用,但我该如何更改呢?

编辑:

我在这里要做的是创建一个由以下内容构成的配置文件:

CONFIG = {
    'client_id': 'XX',
    'client_secret': 'XX',
    'redirect_uri': 'XX'
    }

auth_token = ""

auth_url = ""

access_point = ""

现在,假设我在脚本a.py中使用config.py并设置config.access_point =“web”

因此,如果我在另一个文件中导入config.py,我希望更改反映而不是返回“”。

编辑:

文本文件似乎是一个简单的方法。我也可以使用ConfigParser模块。但是,如果需要在每个服务器请求中读取文件,是不是有点太多了?

3 个答案:

答案 0 :(得分:2)

作为初步,即使来自另一个模块,第二个import语句也不会在导入模块的源文件中重新执行代码(如果先前已加载)。相反,导入已存在的模块只允许您访问该模块的命名空间。

因此,如果您动态更改模块a中的变量,即使是另一个模块中的代码,其他模块实际上也应该看到已更改的变量。

考虑这个测试示例:

testa.py:

print "Importing module a"
var = ""

testb.py:

import testa
testa.var = "test"

testc.py:

import testa
print testa.var

现在在python解释器(或主脚本,如果你愿意):

>>> import testb
Importing module a
>>> import testc
test
>>>

所以你看到导入b时var的变化实际上是在c。

中看到的

我怀疑你的问题在于你的代码是否以及以何种顺序实际执行。

答案 1 :(得分:1)

在文件a.py中定义一个类:

class A:
    class_var = False
    def __init__(self):
        self.object_var = False

然后在b.py中导入并实例化A类的对象:

from a import A
a = A()

现在您可以访问a实例的属性。

a.object_var = True

您可以访问A类的变量:

A.class_var = True

如果您现在检查:

a.class_var
-> True
a.object_var
-> True
another_instance = A()
another_instance.object_var
->False
another_instance.class_var
->True

答案 2 :(得分:0)

好吧,我会使用文本文件在那里设置值,

a.py :
with open("values.txt") as f:
  var = f.read()#you can set certain bytes for read 

因此,每当您导入它时,它都会根据文本文件中的值将新值初始化为var,并且每当您想要更改var的值时,只需更改值{}文本文件