
현상
>>> var = []
>>> def test1():
var.append(1)
>>> test1()
>>>
>>> def test2():
var.append(1)
var = ['mistake']
>>> 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가 발생
해결방법
- 로컬 변수 할당을 변수 사용 이전으로 옮기기
>>> var = []
>>> def test2():
var = ['mistake']
var.append(1)
>>> test2()
>>> var
[]
- global 키워드 사용
>>> var = []
>>> def test2():
global var
var.append(1)
var = ['mistake']
>>> test2()
>>> var
[]
1.과 2.가 서로 다른 결과를 만들어내기에 상황에 맞는 방법 적용 필요.