[파이썬][Error] 022. NameError - free variable 'x' referenced before assignment in enclosing scope
NameError: free variable 'x' referenced before assignment in enclosing scope
오류는 중첩 함수에서 바깥 함수의 지역 변수(x
)를 참조하려고 했지만, 그 변수에 값을 재할당하면서 nonlocal
을 선언하지 않았을 때 발생합니다. 파이썬에서는 내부 함수에서 외부 함수의 지역 변수를 사용할 경우, 해당 변수를 수정하려면 nonlocal
키워드를 명시적으로 사용해야 합니다.
이 오류는 변수 스코프의 규칙을 위반했을 때 발생합니다. 내부 함수에서 변수에 값을 할당하면 그 변수는 기본적으로 내부 함수의 지역 변수로 간주되며, 따라서 바깥 함수의 변수는 가려지게 됩니다. 하지만 내부 함수에서 참조와 할당을 동시에 시도할 경우, 파이썬은 모호성을 피하기 위해 오류를 발생시킵니다.
● 오류 발생 예시
def outer():
x = 10
def inner():
print(x) # 참조 시도
x = 20 # 할당 시도
inner()
outer()
위 코드에서는 x
에 값을 할당하는 코드가 있어 x
는 내부 함수의 지역 변수로 간주되지만, 할당 전에 출력하려 했기 때문에 오류가 발생합니다.
NameError: free variable 'x' referenced before assignment in enclosing scope
● 해결 방법
def outer():
x = 10
def inner():
nonlocal x
print(x)
x = 20
inner()
outer()
nonlocal
키워드를 사용하면 inner()
함수는 외부 x
를 수정하려는 의도를 명확히 하게 되어 오류 없이 실행됩니다.
● 자주 하는 실수
- 내부 함수에서 외부 함수의 변수를 재할당하려고 하면서
nonlocal
을 생략 - 변수 참조와 재할당을 혼용하면서 스코프 충돌 발생
global
과nonlocal
의 역할을 혼동
● 디버깅 팁
- 내부 함수에서 값을 수정할 때는
nonlocal
선언이 필요한지 확인 - 외부 변수를 단순히 참조만 한다면
nonlocal
없이도 가능 - 동일한 이름의 지역 변수가 내부 함수에 존재하는지 확인
● 결론
NameError - free variable 'x' referenced before assignment in enclosing scope
는 파이썬의 스코프 규칙을 정확히 이해하지 못했을 때 자주 발생합니다. 내부 함수에서 외부 변수의 값을 변경하고자 한다면 반드시 nonlocal
키워드를 명시해야 하며, 참조 순서와 스코프 구조에 대한 철저한 이해가 필요합니다.