프로그래밍언어/파이썬[Error]

[파이썬][Error] 022. NameError - free variable 'x' referenced before assignment in enclosing scope

about_IT 2025. 5. 26. 02:01
728x90

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을 생략
  • 변수 참조와 재할당을 혼용하면서 스코프 충돌 발생
  • globalnonlocal의 역할을 혼동

● 디버깅 팁

  • 내부 함수에서 값을 수정할 때는 nonlocal 선언이 필요한지 확인
  • 외부 변수를 단순히 참조만 한다면 nonlocal 없이도 가능
  • 동일한 이름의 지역 변수가 내부 함수에 존재하는지 확인

● 결론

NameError - free variable 'x' referenced before assignment in enclosing scope는 파이썬의 스코프 규칙을 정확히 이해하지 못했을 때 자주 발생합니다. 내부 함수에서 외부 변수의 값을 변경하고자 한다면 반드시 nonlocal 키워드를 명시해야 하며, 참조 순서와 스코프 구조에 대한 철저한 이해가 필요합니다.

728x90