파이썬 3에서는 xrange 함수가 제거되었습니다. 따라서 파이썬 3 프로그램에서 xrange 함수를 사용하려고 하면 NameError: name 'xrange' is not defined 오류가 발생합니다.
이 가이드에서는 이 오류의 의미와 발생 원인을 살펴보고, 실제 예제를 통해 자신의 코드에서 이 오류를 수정하는 방법까지 알아보겠습니다.
NameError: name 'xrange' is not defined란?
파이썬 2에서는 xrange 함수를 사용해 숫자 범위를 생성할 수 있었습니다. 다음 코드를 살펴보겠습니다.
print(xrange(0, 3))
이 코드는 [0, 1, 2]를 반환합니다. 즉, 0부터 3까지(3은 제외)의 모든 숫자를 의미하며, xrange() 함수는 숫자 목록을 반환합니다.
파이썬 3에서는 xrange() 함수를 제거하고 새로운 range() 함수로 대체했습니다. range() 함수는 xrange()와 마찬가지로 숫자 범위를 생성합니다.
xrange()와 range() 사이에는 두 가지 차이점이 있습니다.
xrange()와range()는 이름이 서로 다릅니다.xrange()함수는 숫자 목록을 생성하는 반면,range()함수는 객체를 생성합니다.
range() 함수는 객체를 생성하기 때문에 숫자 목록을 직접 확인하고 싶다면 리스트(list)로 변환해야 합니다. 그 외에는 두 함수가 동일한 방식으로 작동합니다.
오류 발생 예시
카드 게임 리더보드 상위에 랭크된 플레이어 몇 명을 화면에 표시하는 프로그램을 작성해 보겠습니다. 먼저 리더보드를 리스트로 선언합니다.
leaderboard = ["Alex", "Jonas", "Emma", "Kate"]
다음으로 사용자에게 몇 개의 점수를 볼 것인지 입력받습니다.
to_view = int(input("How many scores would you like to view? "))
사용자가 입력한 값을 정수(int)로 변환합니다. xrange() 함수는 정수만 지원하기 때문입니다.
이제 for 루프를 사용해 리더보드 리스트를 반복 처리하며, 사용자가 요청한 수만큼의 결과만 콘솔에 출력합니다.
for l in xrange(0, to_view): print(l + 1, leaderboard[l])
xrange() 함수를 사용해 0부터 사용자가 입력한 숫자 사이의 범위를 생성합니다. for 루프 안에서는 print() 문을 통해 루프가 참조 중인 xrange() 목록의 숫자에 해당하는 리더보드 항목을 출력합니다.
여기서 "l" 값에 1을 더한 순위 번호와 함께 플레이어 이름을 출력합니다. 리스트는 0부터 인덱싱되기 때문에 1을 더함으로써 첫 번째 플레이어가 "0"번이 아닌 "1"번 위치에 표시되도록 한 것입니다.
코드를 실행하면 어떤 결과가 나오는지 확인해 보겠습니다.
How many scores would you like to view? 2 Traceback (most recent call last): File "main.py", line 5, in <module> for l in xrange(0, to_view): NameError: name 'xrange' is not defined
프로그램이 오류를 반환합니다.
해결 방법
숫자 범위를 생성하기 위해 xrange() 함수를 사용했습니다. 파이썬 2에서는 유효한 코드이지만, 현재 프로그램은 파이썬 3으로 실행되고 있으므로 xrange() 함수를 참조할 수 없습니다.
이 오류를 해결하려면 xrange()를 range() 메서드로 교체해야 합니다.
for l in range(0, to_view): print(l + 1, leaderboard[l])
이 사용 사례에서는 xrange()와 range() 모두 동일한 결과를 반환합니다. 코드를 실행해 정상적으로 작동하는지 확인해 보겠습니다.
How many scores would you like to view? 2 1 Alex 2 Jonas
프로그램이 리더보드 상위 두 위치에 있는 플레이어들의 이름을 성공적으로 표시합니다.
xrange() 메서드 재정의는 비추천
이 문제에 대한 임시방편으로 프로그램 시작 부분에 range() 함수와 동일한 xrange라는 변수를 정의하는 방법도 있습니다.
xrange = range
그러나 이 방법은 권장하지 않습니다. 기존 메서드의 이름 변경이라는 근본적인 문제를 회피할 뿐이기 때문입니다. xrange를 변수로 정의했다 하더라도, 파이썬 3 코드베이스를 읽는 다른 사람이 xrange() 구문을 발견하면 혼란스러울 수 있습니다.
가장 좋은 해결책은 xrange() 구문을 range()로 변경하고, 코드베이스 전체가 파이썬 3에서 정상적으로 작동하도록 필요한 수정을 진행하는 것입니다.
마무리
"NameError: name 'xrange' is not defined" 오류는 파이썬 3 환경에서 xrange() 메서드를 사용해 숫자 범위를 생성하려고 할 때 발생합니다. 이 오류를 해결하려면 코드를 업데이트하여 파이썬 3에 내장된 range() 메서드를 사용하세요.
range()는 xrange()의 공식적인 파이썬 3 대체 함수입니다. 이제 여러분도 전문가처럼 이 오류를 손쉽게 해결할 수 있습니다!