사용자로부터 입력을 받는 파이썬 프로그램을 작성할 때, 다음 에러를 만나게 될 때가 있다.
NameError: name 'input' is not defined
간단한 파이썬 프로그램 하나를 실행해보자.
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() 함수의 동작차이다. Python 2.x 버전과 Python 3.x 버전에서의 input() 함수 동작이 다르기 때문에 발생하는 현상이다. Python 3.x 버전에서의 input() 함수는 Python 2.x 버전의 raw_input() 함수와 같다. Python 2.x 버전의 input() 함수는 Python 3.x 버전에서는 삭제되었다.
Python 2.x 버전에서 input() 함수와 raw_input() 함수의 차이점을 살펴보자.
raw_input()
raw_input() 함수는 Python 2.x에서만 존재하는 함수다. 사용자로부터 받은 입력을 '문자열' 형태로 반환해준다. raw_input() 함수를 테스트하기 위해 다음 코드를 Python 2.x 버전에서 실행해보자.
value = raw_input("Input : ")
print "input value : ", value
print "input value type : ", type(value)
정수 10을 입력해보자.
정수 타입의 숫자를 입력했지만 타입은 문자열('str')이다.
그 밖에 실수 값, 문자열 값 등을 입력해도 반환되는 값은 전부 문자열 타입이다.
이와 같이 raw_input() 함수는 사용자로부터 입력받은 값을 무조건 문자열 타입으로 저장한다. Python 3.x 버전의 input() 함수는 Python 2.x 버전의 raw_input() 함수와 동일하다.
input()
위에서 실행했던 코드에서 raw_input() 함수를 input() 함수로 변경해보자.
value = input("Input : ")
print "input value : ", value
print "input value type : ", type(value)
이 코드를 마찬가지로 Python 2.x 에서 실행해보자.
아까 입력했던 값들을 다시 입력하고 비교해보자.
사용자가 입력한 값에 맞는 타입으로 할당이 된다. 정수를 입력하면 정수 타입이, 실수를 입력하면 실수 타입이 할당된다.
이제 마지막으로 따옴표가 없는 Hello를 입력해보자.
에러가 발생한다. 'Hello'라는 이름이 정의되지 않았다는 에러다.
input() 함수는 사용자가 입력한 값을 식(Expression)으로 판단하여 타입을 평가한 다음 그 결과를 변수로 저장하게 된다. 즉, '10'을 입력했으면 '10'이라는 값을 평가하여 정수 10을 얻고, 그 값을 int 타입으로 변수에 저장하게된다.
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를 쓰자.. )
댓글