无法在初始化以外的函数中访问全局变量的值

时间:2015-04-17 14:34:16

标签: python

我有一个用于实时系统的书面python代码,我从一个函数中获取数据并将其分配给一个实际上是全局变量的变量但是当我尝试在其他函数中使用它时我无法获得其他功能的更新值。如何摆脱这个问题。示例代码将详细说明我正在做的事情如下。

obtained_value = 0 

### Inside the continuous loop statement ###
def Startloop(self):
    global obtained_value
    obtained_value = acquire_data()  ## obtained value is getting updated after every 0.25 seconds ##
    ## other statements ##

def some_functions(self):
    ### want to do something which depend on value ###
    print obtained_value             ## does not print value inside "obtained_value"
    val1 = obtained_value * 10
    print val1
    ## etc etc ### 

我没有在some_function中获得与print语句相对应的任何值。似乎全局变量的值没有得到更新。如何解决这个问题。任何建议将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:1)

然后它显示Startloopsome_functions是实例方法,让我们说出类Xyz。

如果你希望obtained_value是一个类变量,它在类的对象(实例)之间共享,那么首先在类中分配它:

class Xyz(object):
    obtained_value = 0.0

    def Startloop(self):
        self.obtained_value = acquire_data()  ## obtained value is getting...
        ## other statements ##

    def some_functions(self):
        ### want to do something which depend on value ###
        print self.obtained_value             ## does not print value...
        val1 = self.obtained_value * 10
        print val1

否则,如果您希望obtained_value成为属于该类的特定对象(实例)的对象变量,则在其构造函数中指定它:

class Xyz(object):

    def __init__(self):
        self.obtained_value = 0.0

    def Startloop(self):
        self.obtained_value = acquire_data()  ## obtained value is getting...
        ## other statements ##

    def some_functions(self):
        ### want to do something which depend on value ###
        print self.obtained_value             ## does not print value...
        val1 = self.obtained_value * 10
        print val1

关键是Python具有命名空间的概念(请继续阅读,不要害怕!) 在第一种情况下,obtained_value被分配到班级'命名空间。 在第二种情况下,obtained_value被分配给对象的命名空间。 obtained_value只是添加到相应名称空间的名称。

如您所见,obtained_value在两种情况下都通过self.obtained_value以相同的方式达成。这是因为Python在对象的命名空间中查找obtained_value。如果它没有找到它,Python会在对象类的命名空间中查找它。

这个答案绝不是详尽无遗的,但我希望它有所帮助。 如果是,请查看官方docs

答案 1 :(得分:0)

再次阅读这两行:

global value
obtained_value = acquire_data()

扰流:

value != obtained_value