이 글에서는 Python 함수 내부에서 지역변수가 값을 할당받기 전에 참조될 때 발생하는 UnboundLocalError의 정의와 주요 원인, 대표 예제, 그리고 효과적인 해결 방법을 단계별로 알아봅니다. 디버깅 팁과 권장 패턴을 통해 실전 코드에서 발생하는 UnboundLocalError를 쉽고 빠르게 해결할 수 있도록 도와드립니다. 다음 챕터에서는 ImportError / ModuleNotFoundError: 모듈/경로 문제를 다룹니다.
1. UnboundLocalError란?
UnboundLocalError는 함수 내에서 지역변수가 할당되기 전에 해당 변수를 참조하려 할 때 발생하는 내장 예외입니다. Python은 함수 본문에서 변수를 할당(assign)하면 해당 이름을 지역(local) 변수로 간주하기 때문에, 할당 지점 이전에 참조하려 하면 이 오류가 뜹니다. 대표적인 메시지는 UnboundLocalError: local variable 'x' referenced before assignment
와 같이 나타나며, 파이썬 인터프리터가 문제의 변수 이름과 위치를 명확히 알려줍니다.
2. 주요 발생 원인
- 함수 내부에서 같은 이름으로 할당 - 함수 안에서 변수를 한 번이라도 할당하면, 전체가 지역 변수로 취급됩니다. - 할당 지점 이전에 참조하면 오류가 발생합니다.
- global/nonlocal 선언 누락 - 전역 변수를 수정하려면
global
키워드, 중첩 함수 변수는nonlocal
선언이 필요합니다. - LEGB 스코프 오해 - Python은 Local, Enclosing, Global, Built-in 순으로 이름을 검색(LEGB 규칙)하며, 할당이 감지되면 로컬 검색만 수행합니다.
- 조건문 내부 할당 후 참조 - 특정 조건문 블록에서만 할당되고, 다른 경로에서 참조될 때 할당되지 않은 상태가 됩니다.
- try-except 블록 내 변수 사용 - 예외 처리 블록에서만 변수에 값을 할당하고, 정상 흐름에서 참조하면 오류가 발생합니다.
3. 실습 예제
아래 예제를 통해 UnboundLocalError 발생 상황을 확인해보세요.
# 예제: 함수 내 지역변수 참조 전에 사용
x = 10
def func():
print(x) # 전역 x가 아닌 지역 x로 간주 → 오류
x = x + 5 # 지역변수 x 할당
func()
위 코드에서 함수 내부의 x = x + 5
구문이 실행되면, Python은 전체 함수 본문에서 x를 지역 변수로 인식합니다. 따라서 print(x)
는 아직 할당되지 않은 지역 x를 참조하게 되어 UnboundLocalError가 발생합니다.
4. 실행 결과 및 설명
Traceback (most recent call last):
File "example.py", line 6, in
func()
File "example.py", line 3, in func
print(x)
UnboundLocalError: local variable 'x' referenced before assignment
에러 메시지는 문제가 된 변수 이름('x')과 함께 할당 이전에 참조되었음을 알려줍니다. 이를 통해 오류 발생 지점을 빠르게 파악할 수 있습니다.
5. 해결 방법 & 디버깅 팁
- global 키워드 사용 - 전역 변수를 함수에서 수정할 때는
global x
선언을 추가합니다.def func(): global x print(x) x = x + 5
- nonlocal 키워드 사용 - 중첩 함수에서 외부 함수의 변수를 수정하려면
nonlocal
을 선언합니다. - 함수 인자 전달 - 필요한 변수는 인자로 전달해 지역변수와 전역변수 충돌을 피합니다.
def func(x): print(x) return x + 5 x = func(x)
- 조건문 할당 점검 - 모든 코드 경로에서 변수가 할당되도록 보장하거나, 할당 전 기본값을 설정합니다.
- 스코프 이해 강화 - Real Python과 같은 자료로 LEGB 규칙을 학습해 스코프 동작을 이해하세요.
6. 정리 및 다음 단계
이번 챕터에서는 UnboundLocalError의 정의, 원인, 예제 및 해결 방법을 살펴보았습니다. global/nonlocal 선언 또는 함수 인자를 통해 지역변수 충돌을 예방하세요. 다음 챕터에서는 ImportError / ModuleNotFoundError: 모듈/경로 문제를 다룰 예정입니다.
'08.개발&프로그래밍 > 1.파이썬' 카테고리의 다른 글
12. Python FileNotFoundError(파일 또는 경로 없음) 완벽 가이드 (0) | 2025.07.18 |
---|---|
11. Python ImportError & ModuleNotFoundError(모듈/경로 문제) 완벽 가이드 (0) | 2025.07.18 |
9. Python AttributeError(없는 속성/메서드 호출) 완벽 가이드 (0) | 2025.07.18 |
8. Python KeyError(딕셔너리에 없는 키 접근) 완벽 가이드 (0) | 2025.07.18 |
7. Python IndexError(시퀀스 인덱스 범위 초과) 완벽 가이드 (0) | 2025.07.18 |