Quark's Outlines: Python 실행 모델

발행: (2026년 4월 4일 오후 09:17 GMT+9)
10 분 소요
원문: Dev.to

Source: Dev.to

(번역을 진행하려면 번역하고자 하는 본문 텍스트를 제공해 주시면 감사하겠습니다.)

파이썬 실행 모델 개요

파이썬 실행 모델이란?

파이썬 프로그램을 실행하면 파이썬은 무엇이 일어나는지어떤 순서로 일어나는지를 결정하는 과정을 따릅니다. 이 과정을 파이썬 실행 모델이라고 합니다. 실행 모델은 코드가 어떻게 그룹화되는지, 값이 어떻게 저장되는지, 문제가 발생했을 때 무엇이 일어나는지를 제어합니다.

  • 코드 블록 – 논리적으로 구문을 묶은 것.
  • 실행 프레임 – 블록의 상태를 저장하고 다음 블록과 연결하는 객체.
  • 네임스페이스 – 이름과 해당 값을 보관하는 매핑.
  • 예외 – 오류가 발생했을 때 발생하는 객체.

이 네 가지 개념—코드 블록, 실행 프레임, 네임스페이스, 예외—이 실행 모델을 구성합니다.

Python은 블록, 이름, 오류를 관리하는 프레임을 사용해 코드를 실행할 수 있게 합니다.

def greet():
    name = "Ada"
    print("Hello,", name)

greet()
# prints:
# Hello, Ada

위 예제에서 greet()새로운 코드 블록새로운 실행 프레임 안에서 실행됩니다. 변수 name은 해당 프레임의 지역 네임스페이스에 존재합니다.

파이썬 실행 모델의 역사적 타임라인

파이썬 실행 모델은 어디에서 왔을까?

파이썬 실행 모델은 초기 언어들(ALGOL, Lisp)의 아이디어를 차용하면서 안전한 이름 처리와 유연한 오류 제어를 추가합니다. 아래 타임라인은 네 가지 핵심 개념이 어떻게 발전했는지를 보여줍니다.

연도주요 사건
1960코드 블록과 스코프가 ALGOL에서 도입 – 중첩 블록과 명확한 로컬 vs. 글로벌 규칙.
1970s스택‑기반 프레임이 Lisp와 C에서 일반화 – 호출 스택과 로컬 스코프 규칙.
1991코드 블록과 프레임이 Python 0.9.0에 추가되어 안전한 함수 호출과 모듈식 설계를 지원.
1995**예외와 try/except**가 도입 (try, except, raise).
2001동적 네임스페이스 접근globals()locals()를 통해 제공.
2006**execeval**이 선택적 네임스페이스 인자를 받도록 개선.
2025실행 모델 안정화 – 인터랙티브, 스크립트, 모듈‑기반 코드에 대한 강력한 지원.

파이썬 실행 모델의 문제와 해결책

파이썬 실행 모델을 올바르게 사용하는 방법은?

파이썬은 코드를 한 줄씩 실행하면서 코드 블록을 만들고, 프레임을 구축하며, 네임스페이스를 사용하고, 필요에 따라 예외를 발생시킵니다. 아래는 흔히 마주치는 문제와 모델을 활용한 해결 방법입니다.

1. 파이썬이 코드를 실행하는 위치 확인하기

문제: 파이썬이 각 코드 블록에 들어가고 나오는 과정을 추적하고 싶다(즉, 현재 활성 프레임을 보고 싶다).

해결책: sys._getframe()(또는 더 높은 수준의 inspect 모듈)을 사용해 호출 스택을 검사한다.

import sys

def outer():
    def inner():
        frame = sys._getframe()
        print("Now running:", frame.f_code.co_name)
    inner()

outer()
# prints:
# Now running: inner

파이썬이 새로운 블록에 들어갈 때마다 코드 객체와 네임스페이스를 담은 실행 프레임을 생성한다.

2. 로컬과 글로벌 이름 구분하기

문제: 함수 안에 value 변수가 있고 모듈 수준에도 value 변수가 있다. 파이썬은 어느 것을 사용할까?

해결책: 각 프레임에는 두 개의 네임스페이스로컬글로벌—가 있다. 파이썬은 먼저 로컬 네임스페이스를 검색하고, 없으면 글로벌 네임스페이스를 찾는다.

value = "global"

def show():
    value = "local"
    print("Value is:", value)

show()
# prints:
# Value is: local

show() 안에서는 로컬 value가 글로벌 value를 가린다.

3. 자체 스코프를 가진 코드 블록 재사용하기

문제: 외부 변수에 영향을 주지 않으면서 일련의 문장을 여러 번 실행해야 한다.

해결책: 함수를 정의한다(또는 다른 호출 가능한 객체). 각 호출마다 새로운 로컬 네임스페이스가 제공된다.

x = 1

def block():
    x = 2
    print("Inside block:", x)

block()
print("Outside block:", x)
# prints:
# Inside block: 2
# Outside block: 1

함수의 로컬 네임스페이스가 주변 모듈 변수와 격리된다.

4. 프로그램을 멈추지 않고 오류 처리하기

문제: 실패할 가능성이 있는 작업을 시도하고 싶지만, 전체 프로그램이 중단되지는 않게 하고 싶다.

해결책: try/except 블록을 사용해 예외를 처리한다.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Cannot divide by zero.")
# prints:
# Cannot divide by zero.

파이썬이 예외를 발생시키고, except 블록이 이를 잡아 프로그램이 계속 실행된다.

5. 현재 글로벌 및 로컬 이름 확인하기

문제: 현재 글로벌과 로컬 스코프에 어떤 이름과 값이 정의되어 있는지 확인하고 싶다.

해결책: 내장 함수 globals()locals()를 사용한다.

def demo():
    a = 10
    b = 20
    print("Local names:", locals())
    print("Global names:", globals().keys())

demo()
  • locals()는 현재 로컬 네임스페이스를 사전 형태로 반환한다.
  • globals()모듈 수준 네임스페이스를 사전 형태로 반환한다.

요약

Python 실행 모델은 코드 블록, 실행 프레임, 네임스페이스, 그리고 예외를 중심으로 구성됩니다. 이 요소들이 어떻게 상호 작용하는지 이해하면 다음을 할 수 있습니다:

  • 프레임을 사용해 프로그램 흐름을 추적합니다.
  • 지역 변수와 전역 변수를 구분합니다.
  • 코드를 자체 스코프에 격리합니다.
  • 오류를 우아하게 처리합니다.
  • 현재 실행 환경을 검사합니다.

이 지식을 바탕으로 언어의 기본 실행 메커니즘을 활용한 보다 명확하고 견고한 Python 코드를 작성할 수 있습니다.

현재 네임스페이스와 이름 및 값 출력 방법

문제

전역 및 지역 네임스페이스의 내용을 확인하고 싶습니다.

해결책

Python은 이 목적을 위해 내장 함수 globals()locals()를 제공합니다.

Python은 내장 조회 도구를 사용해 네임스페이스를 읽을 수 있게 해줍니다.

x = 42

def show():
    y = "Ada"
    print("Globals:", list(globals().keys()))
    print("Locals:", list(locals().keys()))

show()
# prints:
# Globals: ['__name__', '__doc__', ..., 'x']
# Locals: ['y']

이 도구들을 사용하면 각 스코프에 정의된 이름들을 확인할 수 있습니다.

행동 촉구

좋아요, 댓글, 공유, 구독을 눌러 주세요!

이 내용이 도움이 되었나요? 아래 좋아요 버튼을 눌러 알려 주세요. 댓글로 여러분의 생각도 공유해 주세요! 더 많은 비슷한 콘텐츠를 원하시면 구독을 잊지 마세요. 읽어 주셔서 감사합니다!


Mike Vincent – 미국 캘리포니아주 로스앤젤레스에 거주하는 소프트웨어 엔지니어이자 앱 개발자.
More about Mike Vincent

0 조회
Back to Blog

관련 글

더 보기 »

실행 컨텍스트

Execution Context를 주방에 비유해 보세요. 코드를 실행하는 요리를 시작하기 전에 작업 공간, 변수 도구, 그리고 function 레시피가 필요합니다.

Python에서 행렬

행렬 정의 python matrix = 1, 2, 3, 4, 5, 6, 7, 8, 9 3x3 행렬 만들기 python matrix_3x3 = 0 3 for in range3 일반적인 행렬 문제 행렬 전치…

config.py 설정

모든 프로젝트는 같은 방식으로 시작합니다… 몇 가지 값을 hardcode하고, os.getenv 호출을 여기저기 뿌린 뒤, “나중에 정리하겠어”라고 스스로에게 말합니다. 나중은 결코 오지 않습니다. In...