NameError: el nombre global 'xrange' no está definido en Python 3

299

Recibo un error al ejecutar un programa de Python:

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

El juego es de aquí .

¿Qué causa este error?

Pepita
fuente

Respuestas:

571

Está intentando ejecutar una base de código Python 2 con Python 3. cuyo xrange()nombre se cambió range()en Python 3.

Ejecuta el juego con Python 2 en su lugar. No intente portarlo a menos que sepa lo que está haciendo, lo más probable es que haya más problemas más allá de xrange()vs.range() .

Para el registro, lo que está viendo no es un error de sintaxis, sino una excepción de tiempo de ejecución.


Si sabe lo que está haciendo y está haciendo activamente una base de código de Python 2 compatible con Python 3, puede conectar el código agregando el nombre global a su módulo como un alias para range. (Tenga en cuenta que es posible que deba actualizar cualquier range()uso existente en la base de código de Python 2 list(range(...))para asegurarse de que todavía obtiene un objeto de lista en Python 3):

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(...))

o reemplace todos los usos de xrange(...)con range(...)en la base de código y luego use un calce diferente para hacer que la sintaxis de Python 3 sea compatible con Python 2:

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

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

Este último es preferible para bases de código que quieren aspirar a ser Python 3 compatible únicamente en el largo plazo, es más fácil usar a continuación la sintaxis de Python 3 siempre que sea posible.

Martijn Pieters
fuente
8
Gracias por notar la diferencia entre el error de sintaxis y la excepción de tiempo de ejecución. ¡Aprendí algo nuevo!
Pithikos
17

agregue xrange=rangesu código :) Me funciona.

Frost Xu
fuente
77
Como se dice en la respuesta aceptada, no hagas eso, es probable que haya otros problemas. Simplemente ejecute ese código en Python 2.
RobinFrcd
2
@Frost Xu ... por favor considere a Robin Fourcade su comentario y elimine su respuesta. Es un IDE para principiantes y no desea comenzar sumergiéndose profundamente en la depuración y solo aprender sobre los cambios de Python 2/3. Un poco la cintura de tu tiempo.
ZF007
10

Resolví el problema agregando esta importación
Más información

from past.builtins import xrange
Andrés Gutiérrez
fuente
1
-------------------------------------------------- ------------------------- ModuleNotFoundError Traceback (última llamada más reciente) <ipython-input-21-bcd3600b3604> en <module> () - -> 1 de past.builtins import xrange 2 para i en xrange (10): 3 print (i) ModuleNotFoundError: Ningún módulo llamado 'past'
rsc05
2

en python 2.x, xrange se usa para devolver un generador, mientras que el rango se usa para devolver una lista. En python 3.x, xrange se ha eliminado y range devuelve un generador al igual que xrange en python 2.x. Por lo tanto, en python 3.x necesita usar range en lugar de xrange.

Ahmad Farhan
fuente
1

Reemplazar

Python 2 xrangea

Python 3 range

Descansa igual.

Harry_pb
fuente
0

Estoy de acuerdo con la última respuesta. Pero hay otra forma de resolver este problema. Puede descargar el paquete llamado future, como pip install future. Y en su archivo .py ingrese esto "from past.builtins import xrange". Este método es por la situación de que hay muchas xranges en su archivo.

No genio
fuente
Este paquete se utilizará para obtener características de la versión más reciente a la versión anterior de python. No al revés.
mcsim
Lo que past.builtings.rangehace es simplemente establecer xrangecomo referencia range. Esto es útil cuando se crea una base de código políglota Python 2/3, pero no es adecuada para un proyecto existente que está diseñado para funcionar solo en Python 2.
Martijn Pieters