Python : Global/Local Variable

한 때, 무식하게도, for 문 안에서 변수를 만들면 그것도 Local 변수인줄로만 알고 있었다. 수박 겉핥기로 공부를 한 탓이리라.

오늘 좀 더 확실하게 내용을 정리해보고자 한다.


Global 변수는 Local 에서 ‘그냥’ 사용(참고)할 수 있다.

aa = 'Vegan'

def spam():
    print(aa)

spam()
---- 결과는?
Vegan

이처럼, 그냥 참고할 때는 아무 제약이 없다.
그런데, Global 변수를 Local 에서 값을 할당하고자 할 때는 ‘그냥’은 할 수가 없다.
이를 위해서 global 이라는 선언문이 필요하다.

aa = 'Vegan'

def spam():
    global aa
    aa = 'Canivore'
    print(aa)

spam()
---- 결과는?
Canivore

Global 변수는 함수(Local) 앞에 정의될 필요는 없다. 앞이든 뒤든 관계없다.

aa = 'Vegan'

def egg():
    print('This is egg.')
    print(aa)
    print(bb)    

bb = 'Carnivore'
egg()
---- 결과는?
This is egg.
Vegan
Carnivore

그런데, 문제는 Global 과 Local 에서 같은 변수명을 사용할 때 발생한다.

aa = 'Vegan'

def spam(): # 오류
    print('This is spam.')
    print(aa)
    print(bb)
    global bb
    bb = 'Vegetarian'

bb = 'Carnivore'
spam()

--- 결과는..?
  File "./g-l-1.py", line 9
    global bb
    ^
SyntaxError: name 'bb' is used prior to global declaration

바로 이전에서는 print(bb) 에서 별 문제가 없었는데, 그 뒤에 global bb 를 넣었더니 바로 오류가 나버렸다.

global 을 쓰기 위해선, 사용(참고)되기 이전에 자리를 잡아줘야 한다. 여기선 print(bb) 이후에 global bb 가 나와서 문제가 생겼다.
이 에러는 SyntaxError 다.

자리를 바꿔주면 오류는 사라진다.

aa = 'Vegan'

def spam():
    print('This is spam.')
    print(aa)
    global bb
    print(bb)
    bb = 'Vegetarian'

bb = 'Carnivore'
spam()
print(bb)

--- 결과는..?
This is spam.
Vegan
Carnivore
Vegetarian

global bb 를 넣지 않아도 같은 오류가 난다.

aa = 'Vegan'

def egg():
    print('This is egg.')
    print(aa)    
    print(bb)    
    bb = 'Vegetarian'

bb = 'Carnivore'
egg()
print(bb)

--- 결과는..?
This is egg.
Vegan
Traceback (most recent call last):
  File "./g-l-1.py", line 12, in <module>
    egg()
  File "./g-l-1.py", line 8, in egg
    print(bb)    
UnboundLocalError: local variable 'bb' referenced before assignment

여기는 SyntaxError 가 아니고, UnboundLocalError 다. 뭐가 됐든, 원인은 같다.


이렇게 쓰긴 했지만, 가능한한 전역 변수는 사용하지 말라고 한다.

하고 싶은 얘긴 다 했나.. 윤스테이보면서 글을 썼더니 어느 하나도 제대로 못한 느낌이 뭉글뭉글!

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.