NameError: Der globale Name 'xrange' ist in Python 3 nicht definiert


299

Beim Ausführen eines Python-Programms wird eine Fehlermeldung angezeigt:

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

Das Spiel ist von hier .

Was verursacht diesen Fehler?

Antworten:


570

Sie versuchen , eine Python 2 Code - Basis mit Python ausführen 3. xrange()umbenannt wurde range()3 in Python.

Führen Sie das Spiel stattdessen mit Python 2 aus. Versuchen Sie nicht , zu portieren , wenn Sie wissen , was Sie tun, wahrscheinlich wird es mehr Probleme über sein xrange()vs. range().

Für den Datensatz wird kein Syntaxfehler angezeigt, sondern eine Laufzeitausnahme.


Wenn Sie wissen, was Sie tun, und eine Python 2-Codebasis aktiv mit Python 3 kompatibel machen, können Sie den Code überbrücken, indem Sie Ihrem Modul den globalen Namen als Alias ​​für hinzufügen range. (Berücksichtigen Sie, dass Sie möglicherweise eine vorhandene range()Verwendung in der Python 2-Codebasis mit aktualisieren müssen, um list(range(...))sicherzustellen, dass Sie in Python 3 weiterhin ein Listenobjekt erhalten.)

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

oder ersetzen Sie alle Verwendungen von xrange(...)durch range(...)in der Codebasis und verwenden Sie dann einen anderen Shim, um die Python 3-Syntax mit Python 2 kompatibel zu machen:

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

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

Letzteres ist für Codebasen vorzuziehen, die nur auf lange Sicht Python 3-kompatibel sein möchten. Es ist einfacher, wenn möglich nur die Python 3-Syntax zu verwenden.


8
Vielen Dank, dass Sie den Unterschied zwischen Syntaxfehler und Laufzeitausnahme festgestellt haben. Etwas Neues gelernt!
Pithikos

17

füge xrange=rangedeinen Code hinzu :) Es funktioniert bei mir.


7
Wie in der akzeptierten Antwort gesagt, tun Sie das nicht, es wird wahrscheinlich andere Probleme geben. Führen Sie diesen Code einfach in Python 2 aus.
RobinFrcd

2
@Frost Xu ... bitte betrachte Robin Fourcade als seinen Kommentar und entferne deine Antwort. Es ist eine IDE für Anfänger und Sie möchten nicht mit dem Eintauchen in das Debuggen beginnen und sich ausschließlich mit Python 2/3 Änderungen befassen. Ein bisschen Taille deiner Zeit.
ZF007

10

Ich habe das Problem durch Hinzufügen dieses Imports gelöst.
Weitere Informationen

from past.builtins import xrange

1
-------------------------------------------------- ------------------------- ModuleNotFoundError Traceback (letzter Aufruf zuletzt) ​​<ipython-input-21-bcd3600b3604> in <module> () - -> 1 aus past.builtins importiert xrange 2 für i in xrange (10): 3 print (i) ModuleNotFoundError: Kein Modul mit dem Namen 'past'
rsc05

2

In Python 2.x wird xrange verwendet, um einen Generator zurückzugeben, während range verwendet wird, um eine Liste zurückzugeben. In Python 3.x wurde xrange entfernt und range gibt einen Generator zurück, genau wie xrange in Python 2.x. Daher müssen Sie in Python 3.x eher range als xrange verwenden.


1

Ersetzen

Python 2 xrangebis

Python 3 range

Ruhe dich trotzdem aus.


0

Ich stimme der letzten Antwort zu. Es gibt jedoch eine andere Möglichkeit, dieses Problem zu lösen. Sie können das Paket mit dem Namen future herunterladen, z. B. pip install future. Geben Sie in Ihre .py-Datei Folgendes ein: "from past.builtins import xrange". Diese Methode ist für die Situation, dass es viele xranges in Ihrer Datei gibt.


Dieses Paket soll verwendet werden, um Funktionen der neueren Version auf die ältere Version von Python zu übertragen. Nicht anders herum.
McSim

Was past.builtings.rangetut, wird einfach xrangeals Referenz gesetzt range. Dies ist hilfreich beim Erstellen einer Python 2/3-Polyglot-Codebasis, jedoch nicht für ein vorhandenes Projekt geeignet, das nur für Python 2 entwickelt wurde.
Martijn Pieters
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.