NameError : 전역 이름 'xrange'가 Python 3에 정의되어 있지 않습니다


299

파이썬 프로그램을 실행할 때 오류가 발생합니다.

Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 110, in <module>
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 27, in __init__
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\class\inventory.py", line 17, in __init__
builtins.NameError: global name 'xrange' is not defined

게임은 여기 에서 있습니다 .

이 오류의 원인은 무엇입니까?

답변:


570

Python 3 xrange()에서 Python 2 코드베이스를 실행하려고합니다 range().

대신 Python 2로 게임을 실행하십시오. 당신은 당신이 무엇을하는지 아는하지 않는 포트를하려고하지 마십시오, 가장 가능성이 넘어 더 많은 문제가있을 것입니다 xrange()range().

레코드의 경우 구문 오류가 아니라 런타임 예외입니다.


현재하고있는 일을 알고 있고 Python 3과 호환되는 Python 2 코드베이스를 적극적으로 만들고 있다면에 대한 별칭으로 모듈에 전역 이름을 추가하여 코드를 브리지 할 수 있습니다 range. ( 파이썬 3에서리스트 객체를 계속 얻기 위해 파이썬 2 코드베이스에서 기존 사용 을 업데이트해야 할 수도 있음을 고려하십시오 ) :range()list(range(...))

try:
    # Python 2
    xrange
except NameError:
    # Python 3, xrange is now named range
    xrange = range

# Python 2 code that uses xrange(...) unchanged, and any
# range(...) replaced with list(range(...))

또는 코드베이스에서 xrange(...)with range(...)를 모두 사용한 다음 다른 shim을 사용하여 Python 3 구문을 Python 2와 호환되도록하십시오.

try:
    # Python 2 forward compatibility
    range = xrange
except NameError:
    pass

# Python 2 code transformed from range(...) -> list(range(...)) and
# xrange(...) -> range(...).

후자는 장기적으로 파이썬 3과 호환되는 것을 목표로하는 코드베이스에 바람직하며 , 가능할 때마다 파이썬 3 구문을 사용하는 것이 더 쉽습니다.


8
구문 오류와 런타임 예외의 차이점에 주목 해 주셔서 감사합니다. 새로운 것을 배웠습니다!
Pithikos

17

xrange=range코드에 추가 하십시오 :) 그것은 저에게 효과적입니다.


7
허용 된 답변에서 말했듯이 그렇게하지 마십시오. 다른 문제가있을 수 있습니다. 파이썬 2에서 그 코드를 실행하십시오.
RobinFrcd

2
@Frost Xu ... Robin Fourcade의 의견을 고려하여 답변을 삭제하십시오. 초보자를위한 IDE이며 디버깅에 깊이 빠져 들어가고 파이썬 2/3 변경 사항에 대해서만 배우고 싶지 않습니다. 당신의 시간의 허리.
ZF007

10

나는이 수입 추가하여 문제를 해결
더의 정보를

from past.builtins import xrange

1
-------------------------------------------------- ------------------------- ModuleNotFoundError <모듈> ()에서 <ipython-input-21-bcd3600b3604>의 역 추적 (가장 최근 호출)- -> past.builtins에서 1 xrange (10)에서 i에 대해 xrange 2를 가져옵니다. 3 print (i) ModuleNotFoundError : 'past'라는 모듈 없음
rsc05

2

python 2.x에서 xrange 는 생성기 를 반환하는 데 사용되고 range 는 목록을 반환하는 데 사용됩니다. python 3.x에서 xrange 는 제거되었으며 range 는 python 2.x의 xrange 와 같은 생성기를 반환합니다 . 따라서 파이썬 3.x에서는 xrange 대신 range를 사용해야합니다.


1

바꾸다

파이썬 2 xrange에서

파이썬 3 range

모두 똑같이 쉬십시오.


0

마지막 답변에 동의하지만이 문제를 해결하는 또 다른 방법이 있습니다 .pip install future와 같은 future라는 패키지를 다운로드 할 수 있습니다. 그리고 .py 파일에서 "past.builtins import xrange"에서 입력 파일에 xrange가 많은 경우를위한 것입니다.


이 패키지는 최신 버전의 기능을 이전 버전의 Python으로 가져 오는 데 사용됩니다. 다른 방법은 아닙니다.
mcsim

무엇에 대한 참조로 past.builtings.range설정 xrange됩니다 range. 이것은 Python 2/3 폴리 글롯 코드베이스를 만들 때 유용하지만 Python 2에서만 작동하도록 설계된 기존 프로젝트에는 적합하지 않습니다.
Martijn Pieters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.