AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

글로벌 변수가 Python 바이트코드에서 어떻게 작동하는가

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

  • Python 내부 메커니즘을 이해하고자 하는 개발자
  • 인터프리터 구현이나 바이트코드 분석에 관심 있는 중급~고급 개발자
  • 언어 설계 원칙에 대한 심화 학습을 원하는 프로그래머

핵심 요약

  • LOAD_GLOBAL 명령어는 런타임에 글로벌 스토어에서 변수를 동적으로 조회
  • 글로벌 변수는 함수 정의 시에 정의될 필요가 없으며, 실행 시점에 존재해야 함
  • Python의 동적 이름 해석은 globals()와 같은 메커니즘을 통해 가능

섹션별 세부 요약

1. 예제 코드 분석

  • add_useless 함수의 바이트코드는 LOAD_FASTLOAD_GLOBAL 명령어 사용
  • y = 11은 코드 객체에 상수로 포함되지 않고, 런타임에 글로벌 스토어에서 조회
  • LOAD_FAST는 로컬 변수의 인덱스 기반 접근, LOAD_GLOBAL은 이름 기반 동적 조회

2. 글로벌 스토어의 역할

  • 글로벌 스토어는 모듈별로 정의되는 변수명-객체 매핑
  • globals() 호출 시 해당 모듈의 글로벌 스토어에 접근 가능
  • 힙 메모리에 저장된 객체를 참조하는 레퍼런스를 유지

3. 동적 이름 해석의 예시

  • y = 11y = 1로 변경 시 add_useless(9)의 결과가 2010으로 변경
  • 글로벌 변수는 실행 시점에 변경 가능하며, 함수 내부에서 동적으로 반영

4. 레이지 폴딩(monkey patching) 예시

  • other 모듈의 foo 함수를 외부에서 재정의하여 호출 시 동작 변경
  • Python의 동적 이름 해석이 레이지 폴딩을 가능하게 함
  • globals()['a'] = "Second"와 같은 직접적인 스토어 수정도 가능

결론

  • 글로벌 변수는 Python의 동적 특성으로 인해 런타임에 유연하게 수정 가능
  • dis 모듈을 활용해 자체 함수의 바이트코드를 분석해보는 것이 학습에 유리
  • 로컬 변수는 성능 최적화를 위해 인덱스 기반 접근, 글로벌 변수는 동적 해석으로 인해 성능 저하
  • 메모리 공유 구조로 인해 여러 모듈 간 동일한 이름의 글로벌 변수가 존재 가능