대입문(assignment statement) 이름 = 식은 오른쪽 식을 그때 한 번 계산해 값 하나를 만들고, 왼쪽 이름을 그 값에 붙입니다. 값에 붙인 이 이름을 변수(variable)라고 합니다.
값에 이름을 붙여 두면 같은 값을 여러 줄에서 다시 쓸 수 있고, 코드를 읽는 사람도 그 값이 무엇인지 이름으로 압니다.
그런데 =는 수학의 '같다'와 모양만 같고 하는 일은 다릅니다. 이 차이를 놓치면 대입이 이어지는 코드에서 결과를 틀리게 예측합니다.
이 레슨에서는 규칙 2를 세웁니다.
1값에 이름을 붙인다
price = 4000은 'price는 4000이다'가 아니라 'price를 4000에 붙인다'로 읽습니다. 같은 일을 '4000을 price에 대입한다'고도 말합니다.
price = 4000
print(price)
print('price')
4000
price1번 줄이 이름 price를 값 4000에 붙입니다. 2번 줄의 print(price)는 이름 price가 붙은 값을 찾아 4000을 찍습니다.
3번 줄처럼 따옴표로 감싸면 이름이 아니라 글자라서, 글자 price가 그대로 찍힙니다.
그림은 이름을 둥근 이름표로, 값을 네모 칸으로 그리고 화살표로 잇습니다. 값 칸 위의 int는 그 값이 정수라는 표시입니다. 값의 종류는 2단원의 수와 글자에서 봅니다.
이름은 짧은 영어 낱말로 짓습니다. 대문자와 소문자는 다른 이름이라 Price와 price는 서로 다른 이름입니다.
2오른쪽을 그때 한 번 계산한다
아래 코드는 대입이 세 번 이어지고, 마지막 줄이 b를 찍습니다. 그림은 이 가운데 1~3번 줄을 실행합니다.
a = 1
b = a + 1
a = 10
print(b)
2대입은 두 박자로 일합니다. ① 오른쪽 식을 계산해 값 하나를 만들고, ② 왼쪽 이름을 그 값에 붙입니다.
- 1번 줄: ① 오른쪽 1이 값 1이 됩니다. ② 이름 a가 1에 붙습니다.
- 2번 줄: ① 오른쪽
a + 1에서 a가 붙은 값 1을 꺼내 1 + 1을 계산해 새 값 2를 만듭니다. ② 이름 b가 2에 붙습니다. - 3번 줄: ① 새 값 10이 생깁니다. ② 이름 a가 10에 다시 붙습니다. 이름을 다른 값에 다시 붙이는 일은 다음 레슨에서 자세히 봅니다.
- 4번 줄: 이름 b가 붙은 값 2를 찍습니다.
3번 줄에서 a가 10에 붙어도 b는 2 그대로입니다. 2번 줄은 a + 1이라는 식을 b에 저장하지 않았습니다. 그때 한 번 계산한 값 2에 b를 붙였을 뿐이고, 그 계산은 거기서 끝났습니다.
규칙 2.
=는 오른쪽을 그때 한 번 계산해 값 하나를 만들고, 왼쪽 이름을 그 값에 붙입니다.
그래서 =의 왼쪽에는 이름이, 오른쪽에는 계산할 식이 옵니다. 두 값이 같은지 물을 때는 == 기호를 따로 씁니다(4단원).
3이름은 붙인 뒤에야 쓸 수 있다
이름을 읽으려면 그 이름을 먼저 값에 붙여 두어야 합니다. 붙인 적 없는 이름을 읽으면 NameError가 납니다.
totl = 4000
print(total)
Traceback (most recent call last): File "main.py", line 2, in <module> print(total) ^^^^^NameError: name 'total' is not defined. Did you mean: 'totl'?오류는 2번 줄에서 났지만 고칠 곳은 1번 줄입니다. 1번 줄에서 이름을 totl로 잘못 붙여, 2번 줄이 total을 찾았을 때 그런 이름이 없었습니다.
오류 메시지 읽기에서 본 셋째 차례, 곧 그 줄에 쓰인 이름을 만든 앞줄을 보는 일이 여기서 쓰입니다. 1번 줄을 total = 4000으로 고치면 4000이 찍힙니다.
예제
수학으로 읽으면 말이 안 되는 줄이 있습니다. 오류가 날지, 무엇이 찍힐지 먼저 적어 본 뒤 결과를 펼쳐 보세요.
x = 5
x = x + 1
print(x)
실행 결과 보기
6예상과 다르면 그곳이 배울 곳입니다. 2번 줄은 '같다'가 아니라 대입입니다. 오른쪽 x + 1을 먼저 계산해 5 + 1로 새 값 6을 만들고, 이름 x를 6에 붙입니다(규칙 2). 그래서 오류 없이 6이 찍힙니다.
값마다 이름을 붙여 카페 영수증 세 줄을 찍습니다. 합계는 파이썬이 계산합니다.
coffee = 4000
latte = 4500
total = coffee + latte
print('커피', coffee, sep=': ')
print('라테', latte, sep=': ')
print('합계', total, sep=': ')
커피: 4000
라테: 4500
합계: 85003번 줄이 coffee와 latte가 붙은 값을 꺼내 더한 8500에 이름 total을 붙입니다. 1번 줄의 값을 바꿔 다시 실행하면, 3번 줄이 그때 붙어 있는 값으로 새로 계산합니다.
자주 틀리는 곳
틀린 생각: y = x + 1은 식을 저장해 두어, 뒤에서 x가 바뀌면 y도 다시 계산된다.
수학에서 y = x + 1은 x가 바뀌면 y도 따라 바뀌는 관계라 그렇게 읽게 됩니다. 파이썬의 =는 대입하는 그때 한 번만 계산합니다.
x = 5
y = x + 1
x = 0
print(x, y)
0 6y는 2번 줄에서 계산한 값 6에 붙었습니다. 3번 줄에서 x를 0에 붙여도 y는 다시 계산되지 않습니다.
맞는 규칙: =는 오른쪽 식을 그때 한 번 계산하고, 왼쪽 이름을 그 값에 붙입니다. 식은 남지 않으니 새 값이 필요하면 대입을 다시 실행합니다(규칙 2).
틀린 생각: =는 양쪽을 바꿔 써도 뜻이 같다.
수학에서는 x = 4와 4 = x가 같은 말이라 그렇게 여기게 됩니다. 파이썬의 =는 왼쪽 이름을 오른쪽 값에 붙이는 일이라 방향이 있습니다.
price = 3500
4000 = price
print(price)
File "main.py", line 2 4000 = price ^^^^SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?4000처럼 코드에 바로 쓴 값을 리터럴(literal)이라고 합니다. 맨 아래 줄은 '여기서는 리터럴에 대입할 수 없다', 곧 값은 = 왼쪽의 이름 자리에 올 수 없다고 말하고, == 기호를 쓰려던 것이냐고 짐작합니다. 힌트대로 2번 줄을 바꾸면 오류는 사라지지만 아무 일도 하지 않는 줄이 됩니다.
price = 3500
4000 == price
print(price)
3500== 기호는 두 값이 같은지 묻기만 하고 이름을 붙이지 않아 price는 3500 그대로입니다.
맞는 규칙: =는 오른쪽 값에 왼쪽 이름을 붙이므로, 이름은 늘 =의 왼쪽에 씁니다. 그래서 4000 = price는 == 기호가 아니라 price = 4000으로 고칩니다(규칙 2).
틀린 생각: Did you mean이 짚어 준 이름이 곧 고칠 답이다.
앞 레슨들에서는 힌트가 print를 맞게 짚어 주었으니, 늘 맞으리라 여기게 됩니다. 힌트는 비슷한 이름을 찾은 짐작일 뿐입니다.
print(price)
price = 4000
Traceback (most recent call last): File "main.py", line 1, in <module> print(price) ^^^^^NameError: name 'price' is not defined. Did you mean: 'print'?파이썬은 price와 비슷한 이름 print를 짐작했지만, 고칠 것은 줄의 차례입니다. 1번 줄이 price를 읽을 때 price는 아직 어느 값에도 붙어 있지 않습니다.
맞는 규칙: 이름을 읽는 줄이 실행될 때 그 이름은 이미 값에 붙어 있어야 합니다. 위에서 아래로 실행하는 지금 코드에서는 붙이는 줄을 위에 둡니다(규칙 1). 힌트는 짐작이니 줄 번호와 앞줄을 보고 고칩니다.
확인 문제
1. 2절 코드의 1번 줄을 a = 5로 바꿨습니다. 무엇이 찍힐까요?
a = 5
b = a + 1
a = 10
print(b)
힌트
2번 줄이 계산할 때 a가 붙어 있는 값을 봅니다(규칙 2).
정답
62번 줄을 실행할 때 a는 5에 붙어 있어 5 + 1 = 6에 b가 붙습니다. 3번 줄은 a만 10에 다시 붙입니다.
흔한 오답은 11입니다. 4번 줄에서 b가 a + 1을 다시 계산한다고 본 것, 곧 식이 저장된다는 생각입니다.
2. 합계가 오류 없이 찍히도록 ㉠~㉣을 위에서 아래로 놓으세요. 실행 결과는 합계 8500입니다.
- ㉠
print('합계', total) - ㉡
latte = 4500 - ㉢
total = coffee + latte - ㉣
coffee = 4000
놓은 뒤에는 이것도 고르세요. ㉢이 ㉠보다 위에 와야 하는 까닭은 무엇일까요?
- ① 이름 total을 값에 붙인 뒤에야 읽을 수 있기 때문
- ② 파이썬이 '합계'라는 글자를 보고 계산부터 하기 때문
- ③ total이 coffee + latte라는 식을 기억해 두었다가 찍을 때 계산하기 때문
힌트
줄마다 = 오른쪽에서 읽는 이름과 왼쪽에 붙이는 이름을 나눠 적어 봅니다.
정답
㉣ ㉡ ㉢ ㉠ 차례이고, 까닭은 ①입니다.
coffee = 4000
latte = 4500
total = coffee + latte
print('합계', total)합계 8500㉣과 ㉡은 서로 바꿔도 됩니다. 둘 다 ㉢보다 위에만 있으면 됩니다.
- ② 파이썬은 '합계'라는 글자의 뜻을 모릅니다. 쓴 차례대로 실행합니다(규칙 6).
- ③ 식이 저장된다는 생각입니다. ㉢을 실행하는 그때 한 번 계산해 8500에 total을 붙입니다(규칙 2).
3. 두 과목 점수의 합을 찍으려다 오류가 났습니다. 이름을 잘못 붙인 곳은 몇 번 줄이고, 그 줄을 어떻게 고쳐야 할까요?
korean = 90
englsh = 85
total = korean + english
print(total)
Traceback (most recent call last): File "main.py", line 3, in <module> total = korean + english ^^^^^^^NameError: name 'english' is not defined. Did you mean: 'englsh'?힌트
맨 아래 줄이 말하는 이름 english가 코드의 어느 줄에서 값에 붙었는지 찾아봅니다.
정답
2번 줄입니다. englsh를 english로 고칩니다.
korean = 90
english = 85
total = korean + english
print(total)175오류는 3번 줄에서 났지만, 이름을 잘못 붙인 곳은 2번 줄입니다. 3번 줄의 english를 englsh로 바꿔도 175가 찍히지만, 철자가 틀린 이름이 남아 뒤에서 english를 읽으면 같은 오류가 다시 납니다.
흔한 오답은 3번 줄입니다. ^가 가리키는 곳이 곧 이름을 잘못 쓴 곳이라고 본 것입니다. ^는 문제를 발견한 곳입니다.
아래 2절 코드의 4번 줄 print(b)를 print(a + b)로 바꾸면 찍히는 값을 봅니다.
처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.