본문 바로가기
컴퓨터/Python

[파이썬] 파이썬 에러 NameError: name 'xrange' is not defined : range vs. xrange 차이점

by HanJoohyun 2017. 11. 2.
반응형


 

 

안녕하세요 한주현입니다.

 

오늘은 파이썬2에서는 잘 실행 되는데 파이썬3에서 실행하면 발생하는 오류 중 하나인,

 

NameError: name 'xrange' is not defined

 

에 대하여 알아보겠습니다.

 

 

 

 문제 상황

 

NameError: name 'xrange' is not defined


파이썬3이 나오고 나서 기존에 파이썬2로 작성된 스크립트를 실행해보니

 

아래와 같이 오류가 났습니다 ㅎㅎ;

 

1
2
3
4
5
6
>>> for i in xrange(1,10,1):
...     print(i)
...
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
NameError: name 'xrange' is not defined
cs

 

왜 오류가 났을까요?

 

 



 해결 방법

 

1
2
3
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
NameError: name 'xrange' is not defined
cs

 

NameError: name 'xrange' is not defined

는 말 그대로 xrange란 용어가 정의되지 않아 NameError가 발생한 것 입니다.

 

NameError: name is not defined 는 아래와 같이 변수가 정의 되어있지 않는 상황에서 발생합니다.

 

1
2
3
4
5
6
7
>>> 1 + num
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
NameError: name 'num' is not defined
>>> num = 2
>>> 1 + num
3
cs

 

xrange는 파이썬3에서 정의되지 않았기에 이러한 오류가 발생한 것 입니다.

 

파이썬3에서는 xrange 대신 range가 xrange의 역할을 하게 되는데요,

 

아래 파이썬2와 파이썬3의 비교에서 자세히 알아보도록 하죠.

 

 

xrange는 파이썬2의 내장함수 (built-in function)로 파이썬2의 range와 비슷하지만 약간의 차이가 있습니다

 

파이썬2
 
1
2
3
4
5
6
7
8
9
10
11
>>> a = range(1,10,1)
>>> a
[123456789]
>>> type(a)
<type 'list'>
 
>>> b = xrange(1,10,1)
>>> b
xrange(110)
>>> type(b)
<type 'xrange'>
cs

 

 

range의 결과는 list로 나오고

xrange의 결과는 xrange 객체로 나오게 됩니다.

 

파이썬3
1
2
3
4
5
>>> a = range(1,10,1)
>>> a
range(110)
>>> type(a)
<class 'range'>
cs

 

반면 파이썬3에서는 range의 결과가 range 객체로 나옵니다.

 

무슨 차이가 있을까요?

 

 

 

파이썬2에서 range와 xrange는 각각 리스트, xrange객체 입니다.

 

range함수를 사용하게 되면 해당 범위의 range를 리스트로 만들어 반환하게 됩니다. 이 과정에서 메모리를 사용하게 됩니다.

 

반면 xrange의 경우는 xrange객체 그 자체로 (생성자 객체를 만듬) for 문과 같은 반복상황에서 해당 범위를 만들게 되죠.

 

 

 

실제로 얼마나 메모리 차지를 하는지 살펴보죠

 

1
2
3
4
5
6
7
8
# python2
>>> import sys
>>> a = range(1,10000)
>>> b = xrange(1,10000)
>>> sys.getsizeof(a)
80064
>>> sys.getsizeof(b)
40
cs

 

sys.getsizeof() 함수는 객체가 얼마나 메모리를 차지하고 있는지 바이트 단위로 표시해주는 함수입니다.

 

보시는 것 처럼 range는 80,064바이트인 반면 xrange는 40바이트 정도군요!

 

 

파이썬3의 range의 메모리 차지량이 작은걸 보니 우리가 생각한 것 처럼 리스트가 아닌 효율적인 객체로 만들었음을 알 수 있습니다.

 

1
2
3
4
5
# python3
>>> import sys
>>> a = range(1,10000)
>>> sys.getsizeof(a)
48
cs

 

 

여러분들께 도움이 되셨으면 좋겠네요


그럼 다음 시간에 만나요!

 

 

 


반응형

댓글