5. 네임스페이스 (Namespace) 심화
앞서 파이썬은 변수 이름과 실제 객체(데이터)를 서로 연결(Binding)하여 관리한다고 배웠습니다. 이렇게 연결된 “이름표”들이 모여있는 격리된 저장 공간을 네임스페이스(Namespace)라고 부릅니다.
네임스페이스는 내부적으로 파이썬의 핵심 딕셔너리(dict) 구조로 구현되어 있으며, 변수의 이름이 Key가 되고 변수에 할당된 객체가 Value가 됩니다.
5.1 네임스페이스에 할당과 조회
모듈(.py 파일) 수준에서 변수를 만들거나, 함수 문법(def)을 통해 함수를 선언하거나, 클래스 문법(class)을 통해 클래스를 선언하면 모두 이 네임스페이스에 각자의 이름표가 등록됩니다.
다시 한 번 전역 네임스페이스를 관리해주는 내장 함수 globals() 를 이용해 작동 원리를 살펴보겠습니다.
# 일반 변수 등록
system_mode = "Production"
# 함수 등록
def calculate_tax():
pass
# 클래스 등록
class Customer:
pass
# 현재 네임스페이스(globals)에 등록된 모든 이름들을 조회해 볼 수 있습니다.
print(list(globals().keys())[-3:])
# 출력 결과: ['system_mode', 'calculate_tax', 'Customer']
우리가 정의한 변수부터 함수, 심지어 클래스의 이름까지 빠짐없이 딕셔너리의 Key로 등록된 것을 볼 수 있습니다.
5.2 전역 접근 규칙과 독립성
각 파이썬 모듈 파일(.py)은 태생적으로 자신만의 고유한 전역(Global) 네임스페이스를 갖습니다. 즉, A 모듈과 B 모듈에 동일한 이름표(예: x = 100)가 존재하더라도, 두 이름표는 완전히 격리된 별개의 공간에서 관리되므로 서로 충돌하지 않습니다.
함수가 바라보는 전역 네임스페이스의 기준
가장 헷갈리기 쉬운 부분은, 모듈 안에 정의된 함수가 변수를 검색할 때 바라보는 전역 공간의 기준입니다.
# file_A.py 모듈
base_value = 100
def print_value():
print(base_value)
# -----------------
# file_B.py 모듈 (현재 실행 중인 파일)
import file_A
base_value = 500
# 외부 모듈의 함수를 호출
file_A.print_value()
# 출력은 500이 아니라 100이 됩니다!
[!IMPORTANT] 함수는 외부 파일에서 불러와서(
import) 실행하더라도, 언제나 자신이 최초에 태어난 원본 모듈(위 예제의 file_A)의 전역 네임스페이스를 최우선으로 검색합니다. 따라서 현재 실행 중인 파일(file_B)에서 변수값을 덮어쓰더라도 원본 모듈의 함수에는 아무런 영향을 주지 못합니다.