본문 바로가기
Python

[Python] 'NameError: name 'input' is not defined' 에러 (raw_input과 input 차이)

by A6K 2021. 7. 6.

파이썬 코딩을 하다가 다음 에러를 만나게 될 경우가 있다.

NameError: name 'input' is not defined

input이 정의되지 않았다는 의미다. 간단한 파이썬 프로그램 하나를 실행해보자.

input_value = input("Please input your value :") 
print(input_value)

사용자로부터 입력을 받아 화면에 그대로 출력해주는 프로그램이다. 이 코드를 실행했을 때, 다음화면처럼 'NameError' 메시지를 받는 경우가 있다.

아무런 문제가 없어보이는 코드인데 'NameError: name 'a' is not defined' 라는 에러메시지가 발생하면서 생각한대로 코드가 동작하지 않는다.

이런 에러의 원인은 Python 2.x 버전에서 발생한다. 같은 코드를 Python 3.x 버전으로 실행하면 NameError는 발생하지 않는다. 뭔가 두 버전 사이에 다른 동작이 있는걸 알 수 있다.

input() vs raw_input()

문제의 원인은 input() 함수에 있다. input() 함수의 동작은 파이썬 2와 파이썬 3에서 다르다. 파이썬 3에서의 input() 함수는 파이썬 2에서 raw_input() 함수와 같다. 파이썬 2의 input() 함수는 파이썬 3로 넘어오면서 삭제되었다.

raw_input()

raw_input() 함수는 파이썬 2에서만 존재하는 함수다. 사용자로부터 받은 입력을 '문자열' 형태로 반환해준다. raw_input() 함수를 테스트하기 위해 다음 코드를 파이썬2에서 실행해보자.

value = raw_input("Input : ")

print "input value : ", value
print "input value type : ", type(value)

입력으로 정수 값인 10을 넣어보자.

정수 타입의 숫자를 입력했지만 반환되는 타입은 문자열 'str'이다. 정수말고 실수, 문자열 값 등을 입력해도 모두 'str' 타입으로 처리가 된다.

이처럼 raw_input() 함수로 사용자에게서 받은 입력은 무조건 문자열 타입으로 처리된다. 파이썬 3에서는 이 동작이 기본으로 바뀌어서 input() 함수가 이 방식으로 동작한다.

input()

위에서 실행했던 raw_input() 함수를 input() 함수로 변경하고 파이썬 2에서 실행해보자.

value = input("Input : ")

print "input value : ", value
print "input value type : ", type(value)

아까 입력했던 값들을 다시 입력하고 비교해보자.

사용자가 입력한 값에 맞는 타입으로 처리가 된다. 만약 따옴표가 없는 Hello 문자열을 입력하면 어떻게 될까?

에러가 발생한다. Hello 라는 이름의 함수 혹은 파이썬에서 다루는 객체가 정의되어 있지 않기 때문이다.

input() 함수는 사용자의 입력을 '식(Expression)'으로 판단하여 타입을 평가한 다음 그 결과를 변수로 저장한다. 즉, '10'을 입력하면 '10'이라는 값을 평가해서 정수 10을 얻고 그 값을 변수에 저장하는 식이다.

Hello를 입력했다면 우선 Hello라는 식을 평가한다. 하지만 Hello라는 식의 값을 평가하려다 Hello가 정의되어 있지 않았다는 사실을 확인하고 NameError를 발생시킨 것이다.

번외로 다음 코드를 실행시켜서 hello를 입력해보자.

hello = "Hello, World"
value = input("Input : ")

print "input value : ", value
print "input value type : ", type(value)

hello를 입력하면 hello라는 변수에 담겨있는 Hello, World라는 문자열이 출력된다.

10*10 이라는 식을 입력하면 계산 결과인 100이라는 값이 변수에 저장되고 출력된다.

이렇게 Python 2 버전에서는 input() 함수와 raw_input() 함수의 동작이 나뉘어 있다. 이 차이를 잘 알고 쓰자. (아니면 Python 3를 쓰자.. )

댓글