web-dev-qa-db-fra.com

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

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 de ici .

Qu'est-ce qui cause cette erreur?

235
Pip

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

Exécutez le jeu avec Python 2 à la place. N'essayez pas de le porter si vous ne savez pas ce que vous faites, il y aura probablement plus de problèmes au-delà de xrange() par rapport à range().

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


Si vous savez ce que vous faites et créez activement un code de base Python 2 compatible avec Python 3, vous pouvez créer un pont entre le code et ajouter le nom global à votre module comme alias pour range. (Tenez compte du fait que vous pouvez mettre à jour toute utilisation de range() existante dans la base de code Python 2 avec list(range(...)) pour vous assurer de continuer à obtenir 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(...) par range(...) dans la base de code, puis utilisez un schéma 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 veulent être Python 3 compatibles uniquement à long terme, il est alors plus facile de utilisez simplement la syntaxe Python 3 chaque fois que cela est possible.

462
Martijn Pieters

ajoutez xrange=range dans votre code :) Cela fonctionne pour moi.

13
Frost Xu

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

from past.builtins import xrange
5

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

1
Ahmad Farhan

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 cette entrée "from past.builtins import xrange". est pour la situation qu'il y a beaucoup de xranges dans votre fichier.

0
Not Genius

Remplacer

Python 2 xrange to

Python 3 range

Reste tous pareil.

0
Harry_pb