안녕하세요 한주현입니다.
오늘은 파이썬2에서는 잘 실행 되는데 파이썬3에서 실행하면 발생하는 오류 중 하나인,
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 1, in <module>
NameError: name 'xrange' is not defined |
cs |
왜 오류가 났을까요?
해결 방법
1
2
3 |
Traceback (most recent call last):
File "<stdin>", line 1, in <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 1, in <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와 비슷하지만 약간의 차이가 있습니다
1
2
3
4
5
6
7
8
9
10
11 |
>>> a = range(1,10,1)
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> type(a)
<type 'list'>
>>> b = xrange(1,10,1)
>>> b
xrange(1, 10)
>>> type(b)
<type 'xrange'> |
cs |
range의 결과는 list로 나오고
xrange의 결과는 xrange 객체로 나오게 됩니다.
1
2
3
4
5 |
>>> a = range(1,10,1)
>>> a
range(1, 10)
>>> 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 |
여러분들께 도움이 되셨으면 좋겠네요
그럼 다음 시간에 만나요!
'컴퓨터 > Python' 카테고리의 다른 글
[파이썬] 파이썬 에러 UnboundLocalError: local variable referenced before assignment (7) | 2017.11.02 |
---|---|
[파이썬] 파이썬 에러 SyntaxError: Non-ASCII character (0) | 2017.11.02 |
[파이썬] 파이썬 에러 KeyError - 두 가지 해결 방법 (2) | 2017.11.02 |
[파이썬] 파이썬 에러 ValueError: invalid literal for int() with base10: '4.3' (0) | 2017.11.01 |
[파이썬] 파이썬 에러 SyntaxError: Missing parentheses in call to 'print' (4) | 2017.11.01 |
댓글