2012-03-30 10 views
6

私はデフォルト変数として使用しているグローバル変数を持っています。私のプログラムで何が起こるかに応じて、これらのデフォルトを変更し、コードの残りの操作を通して変更を持続させる必要があります。私はそれらを変更してどこでも定義したいので、グローバル変数を使用しました。これらの変数をどのように変更しようとしているかを示すテストコードをいくつか示します。Pythonでのグローバル変数の混乱

私はこれを行うと、私は次のような問題を持っている...

  1. プログラムはmyGlobalがメインで定義されていないと思います。しかし、それは です。どうして?
  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です:あなたはまた、よりよい方法であなたの機能の共有状態を持つためにここにクラスを使用することができ、言っ

。あなたのコードブロックの前にmainmySubglobal myGlobalを挿入すれば、予測可能な動作が得られます。それでも、関数間で状態情報を渡す必要がある場合は、関数の引数を使用します。それははるかにきれいです。

関連する問題