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?

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.


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.


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

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.


1

Remplacer

Python 2 xrangeà

Python 3 range

Reste tout de même.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.