2012-03-30 127 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,並且您具有可預測的行爲。話雖如此,如果您必須在函數之間傳遞狀態信息,請將參數用於該函數。這很乾淨。