티스토리 뷰
지역변수와 전역변수는 기본내용이라고 만만히 봤다면 이 글을 보시라.
정말로 정확히 알고있는지 확인해보자.
다음은 아이슬랜드에가서 아이스크림을 먹으려하는데 빙산을 만나는 코드다 (...)
class Ice:
def cream(self):
raise Exception
def berg(self):
print('iceberg')
def iceland():
print('!WELCOME ICELAND!')
try:
ice.cream()
except:
ice.berg()
if __name__=="__main__":
ice = Ice()
iceland()
먼저 ice객체 생성 후 iceland()함수로가서 아이스크림을 먹으려시도한다. 그런데 위에서 일부러 에러를 발생시켰기때문에 자연히 빙산으로 가게되는 코드다. 이를 실행시키면
이렇듯 잘 나온다.
그럼 이번엔 빙산으로 가면 ice객체를 새로 생성하도록 해보자.
def iceland():
print('!WELCOME ICELAND!')
try:
ice.cream()
except:
ice.berg()
ice = Ice()
아래 한 줄이 추가되었다.
그런데 이를 실행하면 UnboundLocalError가 난다.
UnboundLocalError: local variable 'ice' referenced before assignment
선언되기 전에 ice를 썼다고? 무슨 소리야? ice=Ice()라고 위에서 선언했는데!!
이게 왜 문제가 되는지 알겠다면 아래는 안 읽어도 좋다.
필자는 여기서 엄청 해멨는데 결론부터 말하자면 ice가 local변수이기 때문이다. 아니 왜?
그 전에는 ice.cream() 이나 ice.berg() 실행이 잘만 되었는데 (=global변수 취급했는데) 왜 갑자기 local로 인식하는 걸까?
원인은 ice=Ice()라고 선언했기때문이다. 이 선언문이 없었다면 함수는 ice객체를 외부에서 읽었겠지만(=전역으로 인식했겠지만) 함수 안에서 ice객체를 선언했기때문에 이제 ice변수는 전역변수가 아닌 지역변수가 되어버렸다. 따라서 선언하기 전에 ice.berg()가 위에서 사용되었다는 에러를 보내는 것이다.
그렇다면 ice객체를 새로 생성하려면?
전역변수라고 표기해주면된다.
def iceland():
print('!WELCOME ICELAND!')
global ice
try:
ice.cream()
except:
ice.berg()
ice = Ice()
결과도 맞게 나왔다.
지역변수와 전역변수에 대한 전체적인 설명을 보고싶다면 https://python.bakyeono.net/chapter-3-4.html 여기를 추천한다.
'Python > Python 기초' 카테고리의 다른 글
Managing Python packages the right way (0) | 2021.03.26 |
---|---|
딕셔너리파일을 JSON으로 변환하기 (0) | 2019.06.18 |
crontab을 이용한 디비에 데이터 자동적재하기 (0) | 2018.11.09 |