본문으로 건너뛰기

이름표 다시 붙이기

파이썬 목차첫 프로그램레슨 5 / 59

목차

이름은 값에 붙은 이름표입니다. 이름을 다른 값에 다시 붙이면 옛 값과의 연결은 끊기고, 한 값에는 이름이 여럿 붙을 수 있습니다.

변수를 값을 담는 상자로 생각하면, 새 값을 넣어도 옛 값이 남는다거나 두 이름이 서로 따라 바뀐다고 잘못 예측하기 쉽습니다. 파이썬에서 이름은 값을 담지 않고 값을 가리킬 뿐입니다. 이 그림을 지금 세워 두면, 뒤에서 리스트를 배울 때 생각을 뒤집지 않아도 됩니다. 이 레슨에서는 규칙 3을 세웁니다.

10단계 중 1단계. 같은 이름 x에 두 번 대입하는 코드입니다.

1다시 붙이면 옛 연결은 끊긴다

그림의 첫 코드는 같은 이름 x에 두 번 대입합니다.

x = 5
x = 7
print(x)
실행 결과
7

1번 줄이 이름 x를 값 5에 붙입니다. 2번 줄은 새 값 7을 만들고 x를 7에 다시 붙입니다. 이때 x와 5의 연결은 끊깁니다. 5가 7로 바뀐 것이 아닙니다. 5는 그대로 있지만 이제 5를 가리키는 이름이 없어, x로는 그 5를 다시 꺼낼 수 없습니다. 그림은 이런 값을 점선 칸으로 남겨 '가리키는 이름 없음'이라고 적습니다. 3번 줄은 x가 지금 붙어 있는 값 7을 찍습니다.

규칙 3. 이름은 값에 붙은 이름표입니다. 다시 붙이면 옛 연결은 끊기고, 한 값에 이름이 여럿 붙을 수 있습니다.

2한 값에 이름이 여럿 붙는다

그림의 둘째 코드는 이름 둘을 씁니다. 1·2번 줄은 그림의 둘째 코드와 같습니다.

a = 10
b = a
print(a, b)
실행 결과
10 10

2번 줄 b = a도 대입이라 오른쪽부터 계산합니다(규칙 2). 오른쪽 a를 계산하면 a가 붙은 값 10이 나옵니다. 이때 새 값을 만들지 않습니다. 이름 b를 a가 붙은 바로 그 10에 붙입니다. 이제 값 10에는 이름표가 둘입니다. 그림은 값 칸 머리에 그 값을 가리키는 이름을 모두 적습니다. 10의 칸에는 a와 b가 함께 적힙니다.

3하나를 다시 붙여도 다른 이름은 그대로

그림의 둘째 코드 전체입니다.

a = 10
b = a
a = a + 1
print(b)
실행 결과
10

3번 줄은 오른쪽 a + 1을 계산해 새 값 11을 만들고, a만 11에 다시 붙입니다. b는 10에 그대로 붙어 있어 4번 줄은 10을 찍습니다. b가 10 그대로인 것은 b가 a의 사본이라서가 아닙니다. 3번 줄이 a를 새 값에 다시 붙였을 뿐, b가 붙은 10은 건드리지 않았기 때문입니다. 그래서 이 레슨은 '값을 바꾼다' 대신 '다시 붙인다'라고 씁니다. 수는 그 자리에서 바뀌는 일이 없어 a + 1은 늘 새 값을 만듭니다. 그 자리에서 바뀔 수 있는 값도 있습니다. 리스트를 배우면, 한 값에 붙은 두 이름 가운데 하나로 값을 바꿨을 때 다른 이름으로 봐도 바뀌어 있는 모습을 봅니다(리스트와 이름 둘).

예제

같은 이름에 대입이 세 번 이어집니다. 무엇이 찍힐지 먼저 적어 본 뒤 결과를 펼쳐 보세요.

cups = 1
cups = 2
cups = cups + 1
print(cups)
실행 결과 보기
실행 결과
3

예상과 다르면 그곳이 배울 곳입니다. 1, 2, 3이 모두 찍히거나 더해서 6이 찍힌다고 예상했다면, 이름을 값이 쌓이는 상자로 본 것입니다. 2번 줄이 cups를 2에 다시 붙이고, 3번 줄이 그 2에 1을 더한 새 값 3에 다시 붙입니다. 이름은 마지막에 붙은 값 하나만 가리킵니다(규칙 3).

커피 값이 내일부터 오릅니다. 오늘 값에 다른 이름을 붙여 두면, coffee를 새 값에 다시 붙여도 오늘 값을 꺼낼 수 있습니다.

coffee = 4000
today = coffee
coffee = 4500
print('오늘', today)
print('내일', coffee)
실행 결과
오늘 4000
내일 4500

2번 줄이 today를 coffee와 같은 4000에 붙입니다. 3번 줄은 coffee만 새 값 4500에 다시 붙이므로 today는 4000에 그대로 남습니다.

자주 틀리는 곳

틀린 생각: 이름은 값을 담는 상자라서, 새 값을 넣어도 옛 값이 함께 남는다.

변수를 '값을 담는 상자'로 설명하는 자료도 있어 그렇게 그리게 됩니다. 다시 붙이면 옛 값과의 연결은 끊깁니다.

x = 5
x = 7
print(x)
실행 결과
7

2번 줄이 x를 7에 다시 붙이는 순간 5와의 연결은 끊깁니다. 그래서 5 7도 12도 아닌 7이 찍힙니다.

맞는 규칙: 이름은 값에 붙은 이름표라, 다시 붙이면 옛 연결은 끊기고 마지막에 붙은 값 하나만 가리킵니다. 대입이 이어지면 줄마다 이름표를 옮겨 그리며 읽습니다(규칙 3).

틀린 생각: b = a는 a가 붙은 값의 사본을 하나 더 만들어 b에 준다.

뒤에서 a를 다시 붙여도 b가 따라 바뀌지 않으니, b가 따로 사본을 받은 것처럼 보입니다. b = a는 같은 값에 이름을 하나 더 붙일 뿐입니다.

a = 10
b = a
a = a + 1
print(a, b)
실행 결과
11 10

b가 10으로 남은 것은 3번 줄이 a만 새 값 11에 다시 붙였기 때문입니다. b가 붙은 10은 아무도 건드리지 않았습니다. 리스트처럼 그 자리에서 바뀌는 값에서는 두 이름이 함께 바뀐 것으로 보이니, 그때 이 그림을 다시 꺼냅니다.

맞는 규칙: b = a는 새 값을 만들지 않고, a가 붙은 바로 그 값에 b를 하나 더 붙입니다. 그 뒤 a를 다시 붙여도 b는 원래 값에 그대로 붙어 있습니다(규칙 3).

확인 문제

1. 3절 코드의 1번 줄을 a = 3으로 바꿨습니다. 무엇이 찍힐까요?

a = 3
b = a
a = a + 1
print(b)
힌트

2번 줄에서 b가 붙는 값을 먼저 정하고, 3번 줄에서 어느 이름이 옮겨 가는지 봅니다.

정답
실행 결과
3

2번 줄에서 b가 3에 붙고, 3번 줄은 a만 새 값 4에 다시 붙입니다. b는 3 그대로입니다. 흔한 오답은 4입니다. b가 이름 a를 따라 움직인다고 본 것입니다(규칙 3).

2. 실행 결과가 7 5가 되도록 ㉠~㉣을 위에서 아래로 놓으세요.

  • ㉠ print(x, y)
  • ㉡ x = 7
  • ㉢ y = x
  • ㉣ x = 5

놓은 뒤에는 이것도 고르세요. ㉢이 ㉡보다 위에 와야 하는 까닭은 무엇일까요?

  • ① x가 7에 다시 붙기 전에, x가 붙은 5에 y를 붙여 두어야 하기 때문
  • ② y = x가 두 이름을 묶어, 뒤에서 x가 바뀌면 y도 따라 바뀌기 때문
  • ③ ㉡이 먼저 오면 x에 5와 7이 함께 남아 y가 둘 다 받기 때문
힌트

놓아 본 차례대로 줄마다 이름표를 그려, ㉠이 7 5를 찍는지 봅니다.

정답

㉣ ㉢ ㉡ ㉠ 차례이고, 까닭은 ①입니다.

x = 5
y = x
x = 7
print(x, y)
실행 결과
7 5

㉣ 다음에 ㉡·㉢ 차례로 두면 y도 7에 붙어 7 7이 찍힙니다.

  • ② 이름끼리 묶이지 않습니다. y는 그때 x가 가리키던 값 5에 붙고, 뒤에서 x를 다시 붙여도 y는 그대로입니다(규칙 3).
  • ③ 상자 생각입니다. x를 7에 다시 붙이면 5와의 연결은 끊깁니다(규칙 3).

3. score를 시험 점수에 차례로 붙이면서, 중간에 두 번 saved = score를 실행하는 코드입니다. 무엇이 찍힐까요?

score = 70
saved = score
score = 85
saved = score
score = 90
print(saved, score)
힌트

줄마다 이름표를 다시 그려, 6번 줄에 왔을 때 saved와 score가 각각 어느 값에 붙어 있는지 봅니다.

정답
실행 결과
85 90

4번 줄에서 saved가 그때 score가 붙은 85에 붙고, 5번 줄은 score만 90에 다시 붙입니다. 흔한 오답은 90 90입니다. saved가 score를 따라 움직인다고 본 것입니다(따라 옮겨 간다는 생각). 70 85 90처럼 쓰면 이름에 값이 쌓인다고 본 상자 생각입니다.

아래 예제 둘째 코드의 3번 줄 coffee = 4500을 today = 4500으로 바꾸면 찍히는 두 줄을 봅니다.

처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기

더 보기: 리스트와 이름 둘

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

파이썬 목차로