글로벌 변수가 Python 바이트코드에서 어떻게 작동하는가
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- Python 내부 메커니즘을 이해하고자 하는 개발자
- 인터프리터 구현이나 바이트코드 분석에 관심 있는 중급~고급 개발자
- 언어 설계 원칙에 대한 심화 학습을 원하는 프로그래머
핵심 요약
- LOAD_GLOBAL 명령어는 런타임에 글로벌 스토어에서 변수를 동적으로 조회
- 글로벌 변수는 함수 정의 시에 정의될 필요가 없으며, 실행 시점에 존재해야 함
- Python의 동적 이름 해석은
globals()
와 같은 메커니즘을 통해 가능
섹션별 세부 요약
1. 예제 코드 분석
add_useless
함수의 바이트코드는LOAD_FAST
와LOAD_GLOBAL
명령어 사용y = 11
은 코드 객체에 상수로 포함되지 않고, 런타임에 글로벌 스토어에서 조회LOAD_FAST
는 로컬 변수의 인덱스 기반 접근,LOAD_GLOBAL
은 이름 기반 동적 조회
2. 글로벌 스토어의 역할
- 글로벌 스토어는 모듈별로 정의되는 변수명-객체 매핑
globals()
호출 시 해당 모듈의 글로벌 스토어에 접근 가능- 힙 메모리에 저장된 객체를 참조하는 레퍼런스를 유지
3. 동적 이름 해석의 예시
y = 11
→y = 1
로 변경 시add_useless(9)
의 결과가20
→10
으로 변경- 글로벌 변수는 실행 시점에 변경 가능하며, 함수 내부에서 동적으로 반영
4. 레이지 폴딩(monkey patching) 예시
other
모듈의foo
함수를 외부에서 재정의하여 호출 시 동작 변경- Python의 동적 이름 해석이 레이지 폴딩을 가능하게 함
globals()['a'] = "Second"
와 같은 직접적인 스토어 수정도 가능
결론
- 글로벌 변수는 Python의 동적 특성으로 인해 런타임에 유연하게 수정 가능
dis
모듈을 활용해 자체 함수의 바이트코드를 분석해보는 것이 학습에 유리- 로컬 변수는 성능 최적화를 위해 인덱스 기반 접근, 글로벌 변수는 동적 해석으로 인해 성능 저하
- 메모리 공유 구조로 인해 여러 모듈 간 동일한 이름의 글로벌 변수가 존재 가능