NameError: le nom global 'xrange' n'est pas défini dans Python 3

299

Je reçois une erreur lors de l'exécution d'un programme 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

Le jeu est d' ici .

Qu'est-ce qui cause cette erreur?

Pépin
la source

Réponses:

571

Vous essayez d'exécuter une base de code Python 2 avec Python 3. a xrange()été renommé range()en Python 3.

Exécutez plutôt le jeu avec Python 2. Ne pas essayer de le porter à moins que vous savez ce que vous faites, le plus probable , il y aura plus de problèmes au - delà xrange()contre range().

Pour mémoire, ce que vous voyez n'est pas une erreur de syntaxe mais une exception d'exécution à la place.


Si vous savez ce que vous faites et que vous créez activement une base de code Python 2 compatible avec Python 3, vous pouvez relier le code en ajoutant le nom global à votre module comme alias pour range. (Tenez compte du fait que vous devrez peut- être mettre à jour toute range()utilisation existante dans la base de code Python 2 list(range(...))pour vous assurer d'obtenir toujours un objet de liste dans 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(...))

ou remplacez toutes les utilisations de xrange(...)with range(...)dans la base de code, puis utilisez un shim différent pour rendre la syntaxe Python 3 compatible avec Python 2:

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

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

Ce dernier est préférable pour les bases de code qui souhaitent viser à être compatibles Python 3 uniquement à long terme, il est plus facile d'utiliser simplement la syntaxe Python 3 chaque fois que possible.

Martijn Pieters
la source
8
Merci d'avoir noté la différence entre l'erreur de syntaxe et l'exception d'exécution. J'ai appris quelque chose de nouveau!
Pithikos
17

ajoutez xrange=rangevotre code :) Cela fonctionne pour moi.

Frost Xu
la source
7
Comme il est dit dans la réponse acceptée, ne le faites pas, il y aura probablement d'autres problèmes. Exécutez simplement ce code en python 2.
RobinFrcd
2
@Frost Xu ... veuillez considérer Robin Fourcade son commentaire et supprimez votre réponse. C'est un IDE pour les débutants et vous ne voulez pas commencer par plonger profondément dans le débogage et apprendre uniquement sur les changements de python 2/3. Un peu la taille de votre temps.
ZF007
10

J'ai résolu le problème en ajoutant cette importation
Plus d' informations

from past.builtins import xrange
Andrés Gutiérrez
la source
1
-------------------------------------------------- ------------------------- ModuleNotFoundError Traceback (dernier appel le plus récent) <ipython-input-21-bcd3600b3604> dans <module> () - -> 1 de past.builtins importe xrange 2 pour i dans xrange (10): 3 print (i) ModuleNotFoundError: Aucun module nommé 'past'
rsc05
2

en python 2.x, xrange est utilisé pour renvoyer un générateur tandis que range est utilisé pour renvoyer une liste. En python 3.x, xrange a été supprimé et range retourne un générateur comme xrange en python 2.x. Par conséquent, dans python 3.x, vous devez utiliser range plutôt que xrange.

Ahmad Farhan
la source
1

Remplacer

Python 2 xrangeà

Python 3 range

Reste tout de même.

Harry_pb
la source
0

Je suis d'accord avec la dernière réponse.Mais il existe un autre moyen de résoudre ce problème.Vous pouvez télécharger le package nommé future, tel que pip install future.Et dans votre fichier .py, saisissez ceci "from past.builtins import xrange" .Cette méthode est pour la situation où il existe de nombreuses gammes x dans votre fichier.

Pas un génie
la source
Ce package doit être utilisé pour obtenir des fonctionnalités de la nouvelle version à l'ancienne version de python. Pas l'inverse.
mcsim
Ce past.builtings.rangequi est simplement défini xrangecomme une référence à range. Cela est utile lors de la création d'une base de code polyglotte Python 2/3, mais ne convient pas à un projet existant conçu pour fonctionner uniquement sur Python 2.
Martijn Pieters