[python] UnboundLocalError: local variable 'var' referenced before assignment

현상

>>> var = []
>>> def test1():
    var.append(1)       
>>> test1()  
>>>
>>> def test2():
    var.append(1)
    var = ['mistake']  # test1에서 이것이 추가됨
    
>>> test2()
    var.append(1)
UnboundLocalError: local variable 'var' referenced before assignment
  • 함수 test1은 UnboundLocalError 없이 정상적으로 잘 동작하지만, test2는 그렇지 않음.

원인

  • 파이썬에서 함수 내에서 할당된 변수는 무조건 지역변수로 간주됨. 이것은 할당 이전까지 해당 변수가 어떻게 쓰였는지와는 관계가 없음.
  • 위 예시의 test1 함수 내에서는 var이 별도로 할당되고 있지 않기에 test1의 var은 전역 스코프의 var에 바운드되고 문제를 일으키지 않음.
  • 그렇지만 test2에서는 var = ['mistake']와 같이 명시적으로 선언되고 있기에 이 함수 내에서 var는 지역변수로 간주됨. 그런데 그 지역변수가 할당 이전에 var.append(1)와 같이 쓰이고 있으므로 UnboundLocalError가 발생

해결방법

  1. 로컬 변수 할당을 변수 사용 이전으로 옮기기
>>> var = []
>>> def test2():
    var = ['mistake']
    var.append(1)  # ['mistake', 1]
>>> test2()    
>>> var  # 동일한 이름의 로컬 변수에 들어있는 객체 조작은 전역 변수에 영향을 미치지 않음.     
[]
  1. global 키워드 사용
>>> var = []
>>> def test2():
    global var
    var.append(1)
    var = ['mistake']
>>> test2()    
>>> var    
[]

1.과 2.가 서로 다른 결과를 만들어내기에 상황에 맞는 방법 적용 필요.

좋은 웹페이지 즐겨찾기