분석가의 개발 공부/Python

[Python] UnboundLocalError: local variable referenced before assignment

긴기린그림 2020. 6. 2. 00:15

#2. UnboundLocalError:  local variable referenced before assignment

 

파이썬에서 Function을 사용하다보면 종종 UnboundLocalError를 만날 때가 있다. 맨날 찾아보고 잊어버리기를 반복하다가 드디어 정리를 해보기로 함!


1. 변수의 종류

파이썬 변수는 활용 범위에 따라 구분된다.

 

Global Variable : 코드 어디서나 사용할 수 있는 변수

Local Variable : 함수 내에서만 사용할 수 있는 변수


2. UnboundLocalError는 왜 발생하는가?

함수 밖에서 생성된 변수가 함수 내에서 참조(referenced)만 된다면 Global Variable이다.

그런데 이 변수가 함수 안에서 값을 받게 되면 Global로 따로 선언해주지 않는 한, 자동으로 Local Variable로 변경된다.

따라서 함수에서 참조만 받을 때는 에러가 나지 않다가도 값을 부여 받는 순간 UnboundLocalError가 발생하는 것이다.

 

결론은 함수 밖 생성 변수를, 

함수 내 참조 시  Global Variable

함수 내 값 할당 시  Local Variable

 

 

>Reference의 예시 코드를 보면 더 직관적으로 이해가 된다.

x = 10
def test():
    print(x)
    
test() 

test함수 밖에서 선언한 변수 x를 함수 안에서 참조만 하면 Global Variable로 에러가 발생하지 않는다.

하지만, 아래와 같이 함수 내에서 x 값을 재할당하면 UnboundLocalError가 발생한다.

Scope 내에서 변수 값을 할당하면, 해당 변수는 Local Variable이 되면서 외부 Scope의 동일한 이름을 가진 변수를 섀도잉* 처리해버린다.

* Shadowing : 특정 Scope 내 선언된 이름이 외부 Scope와 중첩되면 Local Variable이 우선적으로 참조되고 Global Variable은 접근이 불가함.

x = 10
def test2():
    print(x)
    x += 1
    
test2()    


3. UnboundLocalError 해결방안

함수 내에서 해당 변수를 Global Variable로 선언해주면 해결된다.

x = 10
def test2():
    global x  # 해당 변수를 Global Variable로 선언
    print(x)
    x += 1
    
test2()    

 

 

 

 

Reference

https://medium.com/@vbsreddy1/unboundlocalerror-when-the-variable-has-a-value-in-python-e34e097547d6

 

UnboundLocalError when the variable has a value in Python.

In Python, variables that are only referenced inside a function are implicitly global. If a variable is assigned a value anywhere within…

medium.com