네임스페이스(Namespace)란 무엇인가?
네임스페이스는 스코프(scope)를 구현하는 방식입니다. 파이썬에서는 패키지(package), 모듈(module), 클래스(class), 함수(function), 메서드(method) 각각이 자신만의 "네임스페이스"를 가지며, 변수 이름은 바로 이 네임스페이스 안에서 해석됩니다.
네임스페이스의 생성과 소멸
함수, 모듈, 패키지가 평가(evaluation), 즉 실행을 시작하는 순간 해당 네임스페이스가 생성됩니다. 이것을 일종의 "실행 컨텍스트(evaluation context)"라고 생각하면 이해하기 쉽습니다. 반대로 실행이 끝나면 네임스페이스는 함께 사라지고, 그 안에 담겨 있던 변수들도 더 이상 유효하지 않게 됩니다.
또한 지역 네임스페이스에 원하는 이름이 존재하지 않을 경우 대신 사용되는 전역 네임스페이스(global namespace)도 따로 존재합니다.
변수 이름의 탐색 순서
파이썬은 변수 이름을 참조할 때 먼저 지역 네임스페이스(함수 본문, 모듈 등 현재 코드가 속한 범위)에서 해당 이름을 찾습니다. 여기서 발견되지 않으면 그다음으로 전역 네임스페이스를 확인합니다.
참고로 실제 파이썬의 이름 해석 규칙(LEGB 규칙)은 좀 더 세분화되어 있으며, Local → Enclosing → Global → Built-in 순서로 이름을 차례대로 검색합니다. 즉, 지역 범위에서 시작해 바깥쪽 함수 범위, 모듈 수준의 전역 범위, 마지막으로 내장(built-in) 범위까지 확장해 나가며 이름을 찾습니다.
변수 생성과 global / nonlocal 키워드
일반적으로 변수는 자신이 선언된 지역 네임스페이스에만 생성됩니다. 하지만 함수 안에서 전역 변수나 바깥 함수의 변수를 새로 만들어야 하는 경우도 있습니다. 이럴 때 사용하는 것이 바로 global 문과 nonlocal 문입니다.
global: 함수 내부에서 모듈 수준의 전역 네임스페이스에 변수를 생성하거나 수정할 때 사용합니다.nonlocal: 중첩된 함수 구조에서 바깥쪽 함수(Enclosing scope)의 네임스페이스에 있는 변수를 참조하거나 수정할 때 사용합니다.
이처럼 네임스페이스의 동작 방식을 이해하면 변수 충돌을 피하고, 코드의 스코프 구조를 명확하게 설계할 수 있습니다.