2012-03-30 3 views
6

기본 변수로 사용하고있는 전역 변수가 있습니다. 내 프로그램에서 무슨 일이 일어나는지에 따라 이러한 기본값을 변경하고 코드의 나머지 작업을 통해 변경 사항을 유지할 수 있어야합니다. 나는 그들이 전역 변수를 사용하여 어디서나 변경되고 정의되기를 바란다. 다음은 이러한 변수를 수정하는 방법을 보여주는 테스트 코드입니다.파이썬의 전역 변수 혼동

내가이 작업을 수행 할 때 나는 다음과 같은 문제가 ...

  1. 이 프로그램은 myGlobal 메인에 정의되지 않았 음을 생각한다. 그러나 이 있습니다. 왜?
  2. myGlobal을 변경 한 후 서브 루틴을 호출 할 때. 나는 그런 일이 일어나기를 원하지 않았다.

여기서 수행하려는 작업을 수행하는 올바른 방법은 무엇입니까? 예?

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

그렇지 않으면 할당 그냥 새로운 생성됩니다 : 당신이을 할당하는 대신 함수 내에서 모듈 전역 변수를 읽어 하려면

#!/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 키워드를 필요 전역 변수를 음영 처리하는 지역 변수 (예를 들어, 변경 사항이 전역 변수에 영향을 미치지 않습니다.)

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

    def mySub(self): 
    print self.myVar 

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

뭘 찾는 것은 파이썬에서 global statement이다, 당신은 또한 더 좋은 방법으로 기능을 공유 상태를 가지고 여기에 클래스를 사용할 수 있다고

. 코드 블록 앞에 global myGlobal을 넣고 mainmySub에 삽입하면 예측할 수있는 동작이 나타납니다. 그렇지만 함수간에 상태 정보를 전달해야한다면 함수에 인수를 사용하십시오. 그것은 훨씬 깔끔합니다.