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?

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.


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.


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

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.


1

Zastąpić

Python 2 xrange to

Python 3 range

Spoczywajcie wszyscy sami.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.