2012-03-30 118 views
6

我有一个全局变量,我用它作为默认变量。根据我的程序中发生的情况,我需要能够更改这些默认值,并通过我的代码的其余操作保持更改。我希望它们随处改变和定义,因此我使用了一个全局变量。这里是一些测试代码,显示了我如何修改这些变量。Python中的全局变量混淆

当我这样做,我有以下问题......

  1. 该方案认为,myGlobal尚未在main定义。但它有 。为什么?
  2. 当我改变myGlobal后,我打电话给子程序。我不希望发生这种情况。

什么是正确的方法来完成我在这里要做的事情?例子?

#!/usr/bin/python 

import sys 

myGlobal = "foo" 

print "********************" 
print "MyGlobal %s" % myGlobal 
print "********************" 


def main(argv): 

    #UnboundLocalError: local variable 'myGlobal' referenced before assignment 
    print '1. Printing the global again: ' + myGlobal 

    myGlobal = "bar" 
    print "2. Change the global and print again: " + myGlobal 

    # now call a subroutine 
    mySub() 

# Checks for output file, if it doesn't exist creates one 
def mySub(): 
    # Why isn't the global "bar" not "foo"? 
    print '3. Printing the global again: ' + myGlobal 

    myGlobal = "black sheep" 
    print "4. Change the global and print again: " + myGlobal 




if __name__ == "__main__": 
    main(sys.argv[1:]) 

回答

8

如果你想分配来,而不是从一个函数中读取模块,全局变量,你需要的global关键字:

def main(argv): 
    global myGlobal 
    #... 
    myGlobal = "bar" 

否则分配将只创建一个新的局部变量会影响你的全局变量(所以对它的改变不会影响全局变量,就像你的例子中那样)。

这就是说,你也可以使用一个类在这里有你的功能共享状​​态以更好的方式:

class MyApp(object): 
    def main(self, argv): 
    self.myVar = "bar" 
    self.mySub() 

    def mySub(self): 
    print self.myVar 

MyApp().main(sys.argv[1:]) 
2

你所寻找的是在Python中global statement。在mainmySub之间的代码块之前插入global myGlobal,并且您具有可预测的行为。话虽如此,如果您必须在函数之间传递状态信息,请将参数用于该函数。这很干净。