학습 본문으로 건너뛰기
커리큘럼으로
PythonPRG-01-M01
체험 레슨모듈 01약 12분

이해 · 그림으로 보기

파이썬 첫걸음: 내용·이름표·실행 창

숫자와 글이 만들어지는 모습을 먼저 보고 다시 찾을 이름표를 붙인다. 코드를 한 줄씩 움직이며 달라진 한 곳과 화면에 나온 결과를 적고, 어느 창에서 무엇을 써야 하는지 확인한다. 학습자는 한 줄마다 달라진 곳을 쉬운 말로 설명하고 직접 실행한 코드·기록·표로 맞춰 본다. 책과 개발 문서에서는 틀린 첫 줄을 찾아 고치는 일을 디버그, 새 문제로 다시 맞춰 보는 일을 검증이라고 부른다.

Python 공식 문서를 기준으로 만든 골드 체험 레슨입니다.코드를 실행하지 않고도 예측·바인딩 추적·오개념 교정·학습 증거까지 한 흐름으로 점검할 수 있습니다.

01

먼저, 지금 가진 변수 모델을 꺼내 보세요

score = 7 다음에 score = "seven"을 실행하면 무엇이 바뀐다고 생각하나요? 정답을 찾기 전에 현재 생각을 한 문장으로 남겨 보세요.

02

변수 상자보다 이름표로 이해하기

대입은 객체의 타입을 바꾸는 일이 아니라, 이름이 가리키는 객체를 정하거나 바꾸는 일입니다.
  1. 01이름·객체·값·타입을 서로 구분해 설명할 수 있습니다.
  2. 02대입 전후에 이름이 어떤 객체에 바인딩되는지 추적할 수 있습니다.
  3. 03type(name)이 현재 이름이 가리키는 객체의 타입을 확인한다는 점을 설명할 수 있습니다.

Python 프로그램의 데이터는 객체로 표현됩니다. 각 객체에는 정체성, 타입, 값이 있으며 객체의 타입은 생성된 뒤 다른 타입으로 바뀌지 않습니다.

score = 7을 실행하면 현재 이름 공간의 score가 값 7을 나타내는 int 객체에 바인딩됩니다. 이후 score = "seven"을 실행하면 같은 이름이 str 객체를 가리키도록 재바인딩됩니다.

따라서 두 시점의 type(score) 결과가 다른 이유는 score라는 이름의 타입이 변했기 때문이 아니라, 그 이름이 가리키는 객체가 달라졌기 때문입니다.

이름(name)
이름 공간에서 객체를 참조하도록 바인딩되는 식별자입니다.
객체(object)
Python에서 데이터를 표현하는 단위로, 정체성·타입·값을 가집니다.
바인딩(binding)
이름과 객체 사이의 참조 관계를 만드는 일입니다.
재바인딩(rebinding)
이미 바인딩된 이름이 다른 객체를 참조하도록 관계를 바꾸는 일입니다.

PYTHON MENTAL MODEL · 01

변수는 상자가 아니라 이름입니다

네 단계의 Python 대화형 셸 입력을 직접 선택하며 score가 어떤 객체를 가리키는지 추적해 보세요.

01단계 대입: 이름을 정수 객체에 연결합니다

01 / 04

이름을 정수 객체에 연결합니다

리터럴 7을 평가해 얻은 int 객체에 이름 score를 연결합니다. 변수는 값을 담는 상자가 아니라 객체를 가리키는 이름입니다.

이름을 정수 객체에 연결합니다이름 score에서 값 7과 타입 int를 가진 객체로 화살표가 이어집니다.NAMEscore현재 연결된 이름points toPYTHON OBJECT7intvalue이름을 정수 객체에 연결합니다이름 score에서 값 7과 타입 int를 가진 객체로 화살표가 이어집니다.NAMEscore현재 연결된 이름points toPYTHON OBJECT7intvalue

Python 대화형 셸

REPL · 독립 입력
01 score = 7
SHELL RESPONSE출력 없음 · 이름 공간만 갱신됨

현재 이름 공간

동기화됨
대입 단계 실행 후 이름 score의 값과 타입
이름타입
score7int

위 코드 실행 결과와 도식의 화살표, 값, 타입이 같은 상태를 보여줍니다.

04

score가 가리키는 객체 추적하기

name_binding.py검토된 정적 추적 · 5단계
  1. 01score = 7bind

    우변의 결과인 int 객체에 score라는 이름을 바인딩합니다.

    첫 바인딩
    score가 값 7을 나타내는 int 객체를 가리킵니다.
    이름 공간
    score → 7 · int
    누적 출력
    아직 출력 없음
  2. 02print(type(score).__name__)observe

    현재 score가 가리키는 객체의 타입 이름인 int를 출력합니다.

    타입 관찰
    바인딩은 그대로이며 타입 이름 int가 출력에 추가됩니다.
    이름 공간
    score → 7 · int
    누적 출력
    int
  3. 03score = "seven"rebind

    score가 값 "seven"을 나타내는 str 객체를 가리키도록 재바인딩합니다.

    다른 객체로 재바인딩
    score의 바인딩 대상이 int 객체에서 str 객체로 바뀝니다. 이전 int 객체의 실제 수명은 이 추적에서 판단하지 않습니다.
    이름 공간
    score → "seven" · str
    누적 출력
    int
  4. 04print(type(score).__name__)observe

    현재 바인딩 대상이 str 객체이므로 str을 출력합니다.

    새 바인딩의 타입 관찰
    바인딩은 그대로이며 현재 객체의 타입 이름 str이 출력에 추가됩니다.
    이름 공간
    score → "seven" · str
    누적 출력
    int · str
  5. 05print(score)observe

    score가 현재 가리키는 객체의 값인 seven을 출력합니다.

    현재 값 관찰
    현재 바인딩된 str 객체의 값 seven이 출력에 추가됩니다.
    이름 공간
    score → "seven" · str
    누적 출력
    int · str · seven
FINAL OUTPUT
int
str
seven

객체 ID는 설명용 표식이며 id() 값이나 메모리 주소가 아닙니다. 이전 객체의 실제 수명과 재사용 여부는 구현 세부사항이므로 단정하지 않습니다.

05

“변수가 타입을 바꾼다”는 표현 바로잡기

흔한 표현score 변수의 타입이 int에서 str로 바뀌었다.

이 표현은 하나의 객체가 int에서 str로 변한 것처럼 들립니다. Python 객체의 타입은 생성된 뒤 바뀌지 않습니다.

더 정확한 모델이 예제에서는 score라는 이름이 int 객체를 가리키다가 별개의 str 객체를 가리키도록 재바인딩됩니다.
이전
score → 값 7을 나타내는 int 객체
이후
score → 값 "seven"을 나타내는 str 객체
첫 번째 int 객체 자체가 str 객체로 변했나요?

아닙니다. score가 가리키는 대상이 달라졌습니다. 이전 객체의 수명은 별개의 구현 문제입니다.