NameError: nazwa globalna „xrange” nie jest zdefiniowana w Pythonie 3

299

Podczas uruchamiania programu w języku Python pojawia się błąd:

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

Gra pochodzi z stąd .

Co powoduje ten błąd?

Pypeć
źródło

Odpowiedzi:

570

Próbujesz uruchomić bazę kodu Python 2 z Python 3. xrange()Nazwa została zmieniona na range()w Python 3.

Zamiast tego uruchom grę z Python 2. Nie próbuj do portu, chyba że wiesz co robisz, najprawdopodobniej nie będzie więcej problemów poza xrange()vs.range() .

Dla przypomnienia, to, co widzisz, nie jest błędem składniowym, ale wyjątkiem środowiska wykonawczego.


Jeśli wiesz, co robisz i aktywnie dostosowujesz bazę kodu Python 2 do Python 3, możesz zmostkować kod, dodając globalną nazwę do modułu jako alias range. (Weź pod uwagę, że być może będziesz musiał zaktualizować wszelkie istniejące range()użycie w bazie kodu Python 2, list(range(...))aby upewnić się, że nadal otrzymujesz obiekt listy w 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(...))

lub wymienić wszystkie zastosowania xrange(...)ze range(...)w kodzie, a następnie użyć innego podkładkę aby składnia Python 3 jest kompatybilny z Pythonie 2:

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

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

Ten ostatni jest preferowany w przypadku baz kodowych, które chcą dążyć do zgodności z Python 3 tylko na dłuższą metę, łatwiej jest po prostu użyć składni Python 3, gdy tylko jest to możliwe.

Martijn Pieters
źródło
8
Dziękujemy za zwrócenie uwagi na różnicę między błędem składniowym a wyjątkiem środowiska wykonawczego. Nauczyłem się czegoś nowego!
Pithikos,
17

dodaj xrange=rangeswój kod :) Działa to dla mnie.

Frost Xu
źródło
7
Jak powiedziano w zaakceptowanej odpowiedzi, nie rób tego, prawdopodobnie wystąpią inne problemy. Po prostu uruchom ten kod w python 2.
RobinFrcd
2
@Frost Xu ... rozważ Robin Fourcade jego komentarz i usuń swoją odpowiedź. Jest to IDE dla początkujących i nie chcesz zaczynać od głębokiego debugowania i tylko dowiedzieć się o zmianach w Pythonie 2/3. Nieco talii twojego czasu.
ZF007
10

Rozwiązałem problem, dodając ten import
Więcej informacji

from past.builtins import xrange
Andrés Gutiérrez
źródło
1
-------------------------------------------------- ------------------------- ModuleNotFoundError Traceback (ostatnie ostatnie połączenie) <ipython-input-21-bcd3600b3604> in <module> () - -> 1 z past.builtins importuje xrange 2 dla i w xrange (10): 3 print (i) ModuleNotFoundError: Brak modułu o nazwie „past”
rsc05
2

w python 2.x, xrange jest używany do zwracania generatora, podczas gdy zakres jest używany do zwracania listy. W python 3.x xrange został usunięty, a zakres zwraca generator tak jak xrange w python 2.x. Dlatego w Pythonie 3.x należy użyć zakresu zamiast xrange.

Ahmad Farhan
źródło
1

Zastąpić

Python 2 xrange to

Python 3 range

Spoczywajcie wszyscy sami.

Harry_pb
źródło
0

Zgadzam się z ostatnią odpowiedzią. Ale istnieje inny sposób rozwiązania tego problemu. Możesz pobrać pakiet o nazwie future, na przykład pip install future. A w pliku .py wpisz: „from past.builtins import xrange” .Ta metoda dotyczy sytuacji, w której plik zawiera wiele xrang.

Nie geniusz
źródło
Ten pakiet służy do uzyskiwania funkcji nowszej wersji starszej wersji Pythona. Nie na odwrót.
mcsim
To, co past.builtings.rangestanowi, jest po prostu xrangeodniesieniem range. Jest to pomocne podczas tworzenia bazy kodu poliglotycznego Python 2/3, ale nie nadaje się do istniejącego projektu zaprojektowanego do pracy tylko na Python 2.
Martijn Pieters