391 Stimmen

NameError: globaler Name 'xrange' ist in Python 3 nicht definiert

Ich bekomme einen Fehler beim Ausführen eines Python-Programms:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 110, in 
  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 stammt von hier.

Was verursacht diesen Fehler?

730voto

Martijn Pieters Punkte 953257

Sie versuchen, eine Python 2-Codebasis mit Python 3 auszuführen. xrange() wurde in Python 3 in range() umbenannt.

Führen Sie das Spiel stattdessen mit Python 2 aus. Versuchen Sie es nicht zu portieren, es sei denn, Sie wissen, was Sie tun. höchstwahrscheinlich werden mehr Probleme auftreten als nur xrange() vs. range().

Zur Information: Was Sie sehen, ist kein Syntaxfehler, sondern eine Laufzeitausnahme.


Wenn Sie wissen, was Sie tun, und aktiv eine Python 2-Codebasis mit Python 3 kompatibel machen, können Sie den Code überbrücken, indem Sie den globalen Namen als Alias für range in Ihr Modul hinzufügen. (Beachten Sie, dass Sie unter Umständen jede vorhandene Verwendung von range() in der Python 2-Codebasis mit list(range(...)) aktualisieren müssen, um sicherzustellen, dass Sie immer noch ein Listenobjekt in Python 3 erhalten):

try:
    # Python 2
    xrange
except NameError:
    # Python 3, xrange heißt jetzt range
    xrange = range

# Python 2-Code, der xrange(...) verwendet, unverändert, und alle
# range(...) werden durch list(range(...)) ersetzt

oder ersetzen Sie alle Verwendungen von xrange(...) im Code durch range(...) und verwenden Sie dann ein anderes Hilfsprogramm, um die Python 3-Syntax mit Python 2 kompatibel zu machen:

try:
    # Vorwärtskompatibilität in Python 2
    range = xrange
except NameError:
    pass

# Python 2-Code, der von range(...) -> list(range(...)) und
# xrange(...) -> range(...) transformiert wurde

Letzteres ist vorzuziehen für Codebasen, die langfristig nur mit Python 3 kompatibel sein wollen, es ist einfacher, dann immer nur die Python 3-Syntax zu verwenden, wenn möglich.

29voto

Frost Xu Punkte 315

Füge xrange=range in deinen Code ein :) Es funktioniert für mich.

23voto

Ich habe das Problem gelöst, indem ich diesen Import hinzugefügt habe
Mehr Informationen

from past.builtins import xrange

12voto

Ahmad Farhan Punkte 575

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 nun einen Generator zurück, genau wie xrange in Python 2.x. Daher müssen Sie in Python 3.x range anstelle von xrange verwenden.

4voto

Hari_pb Punkte 5986

Ersetzen

Ändern Sie in Python 2 xrange zu

Python 3 range

Rest alles gleich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X