티스토리 뷰

지역변수와 전역변수는 기본내용이라고 만만히 봤다면 이 글을 보시라.

 

 

 

정말로 정확히 알고있는지 확인해보자.

다음은 아이슬랜드에가서 아이스크림을 먹으려하는데 빙산을 만나는 코드다 (...)

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 여기를 추천한다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함