한 때, 무식하게도, 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 다. 뭐가 됐든, 원인은 같다.
이렇게 쓰긴 했지만, 가능한한 전역 변수는 사용하지 말라고 한다.
하고 싶은 얘긴 다 했나.. 윤스테이보면서 글을 썼더니 어느 하나도 제대로 못한 느낌이 뭉글뭉글!