[Python] global 에 대한 고찰 Develop Tip

파이썬에서도 다른 언어처럼 global 개념이 있지만 약간은 틀리더군요.

다음을 보겠습니다.

GV=10
def gTestA():
i = GV
j = GV+1
print i + j

위 상태에서

gTestA()

를 수행하면 
21
결과를 보여주고 정상 종료 됩니다.

클래스도 보겠습니다.

GV=10
class myClass:
myGV = GV
def __init__(self):
self.myGV = 5
def mA(self):
i = self.myGV
j = myClass.myGV
print i + j
my = myClass()
my.mA()
15

즉, namespace에서 모듈의 global 은 어디서든지 read-only 개념으로 참조가 가능합니다.

하지만 아래의 경우를 보겠습니다.

GV=10
def gTestB():
GV += 1
print GV
gTestB()

수행을 하면,

Traceback (most recent call last):
  File "/home/toor/workpy/SMCLinux/test/global_test.py", line 5, in <module>
    gTestB()
  File "/home/toor/workpy/SMCLinux/test/global_test.py", line 3, in gTestB
    GV += 1
UnboundLocalError: local variable 'GV' referenced before assignment

와 같은 오류가 발생하는 군요.

즉, readonly가 아니라 참조를 하려는데 로컬 변수 사전에서 못 찾는다는 것이겠지요.

GV +=1 윗줄에
global GV
라는 것을 주면 global 사전에 GV가 추가되고, 글로벌 변수를 이용하여 
값을 변경하는 것도 가능합니다.

GV=10
def gTestB():
global GV
GV += 1
print GV
gTestB()

어느분께는 도움이 되셨기를 바랍니다.

덧글

  • rcho 2013/10/08 09:56 # 삭제 답글

    당첨! 제가 어느 분이 되었네요, 깔끔한 설명 감사합니다.
  • 지훈현서아빠 2013/10/08 12:04 #

    도움이 되셨다니 저의 보람입니다~
  • maksat 2015/07/17 11:21 # 삭제 답글

    감사합니다. 좋은 참고가 되었습니다.
  • 지훈현서아빠 2015/07/17 11:49 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 신입이 2015/10/21 19:28 # 삭제 답글

    감사합니다! 저도 어느분이 되었네요! 덕분에 쉽게 배우고 간단히 해결해 갑니다! 감사합니다.!
  • 지훈현서아빠 2015/10/22 09:44 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 아오.. 2015/12/16 02:09 # 삭제 답글

    아.. 이 글 덕분에 1시간 삽질하던거 해결됬습니다..ㅠㅠ감사합니다
  • 지훈현서아빠 2015/12/16 08:50 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 초보 2015/12/29 15:45 # 삭제 답글

    그런데... DLL 호출 후에 DB 연결을 하고자 하는 경우 발생하는 것은 왜 그런가요?

    DLL 호출 후 리턴 값도 잘 받고 했는데... 아래와 같이 DLL 호출 후 DB 연결만 하려고 하면 오류가 발생을 합니다. DB 연결 제외하고는 다 문제가 없는데요.

    re = daDll.da_PcPos(3, req_char, rep_text)

    if re == -1:
    self.QueryData()

    아래에서 connDB에 할당을 하고자할 때 Exception에 걸려서 "UnboundLocalError: local variable 'cur' referenced before assignment" 오류가 나옵니다.

    def QueryData()
    global gsHOST_DB, gsPORT_DB, gsUSER_DB, gsPSWD_DB, gsSCHEMA_DB

    try:
    connDB = pymysql.connect(host=gsHOST_DB, port=int(gsPORT_DB), user=gsUSER_DB, passwd=gsPSWD_DB, db=gsSCHEMA_DB, charset='utf8', use_unicode=True)
    cur = connDB.cursor()

    cur.execute(""" SELECT DEPOSIT_DIV_NM
    , DEPOSIT_DIV_CD
    FROM ADM_DEPOSIT_DIV
    ORDER BY ORDER_SEQ """,)

    rows = cur.fetchall()
    self.cbxPayMethod.Clear()
    for row in rows:
    self.cbxPayMethod.Append(row[0])

    except:
    exception = sys.exc_info()[1]
    wx.MessageBox(exception.args[1], u'오류', wx.OK | wx.ICON_INFORMATION)

    finally:
    cur.close()
    connDB.close()
  • 균5 2016/04/12 14:13 # 삭제 답글

    도움 되었습니다. 감사합니다! ^^
  • 지훈현서아빠 2016/04/13 15:45 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 호호람람 2016/05/07 01:51 # 삭제 답글

    왜 읽기는 되는데 쓰기는 안되나 했는데 이런 이유에서 였군요. 감사합니다~
  • 지훈현서아빠 2016/05/08 10:11 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 강일동 2017/02/21 11:13 # 삭제 답글

    도움이되었습니다. 감사합니다.
  • 지훈현서아빠 2017/02/21 12:35 #

    도움이 되셨다니 저의 보람입니다. ^^
  • 박종문 2017/10/12 13:02 # 삭제 답글

    2시간 삽질하던 것을 해결했습니다. 큰 도움이 되었습니다.
    감사합니다.
  • 지훈현서아빠 2017/10/12 13:29 #

    도움이 되셨다니 저의 보람입니다~ ^^
댓글 입력 영역

구글애드텍스트