NameError: глобальное имя 'xrange' не определено в Python 3


299

Я получаю сообщение об ошибке при запуске программы на 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

Игра из отсюда .

Что вызывает эту ошибку?

Ответы:


571

Вы пытаетесь запустить кодовую базу Python 2 с Python 3. xrange()был переименован range()в Python 3.

Запустите игру с Python 2 вместо. Не пытайтесь портировать его, если вы не знаете, что делаете, скорее всего, будет больше проблем, чем xrange()противrange() .

Для записи, что вы видите, это не синтаксическая ошибка, а исключение времени выполнения.


Если вы знаете, что делаете, и активно делаете кодовую базу Python 2 совместимой с Python 3, вы можете связать код, добавив глобальное имя в свой модуль в качестве псевдонима для range. (Учтите, что вам, возможно, придется обновить любое существующее range()использование в базе кода Python 2, list(range(...))чтобы гарантировать, что вы по-прежнему получаете объект списка в 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(...))

или заменить все виды использования xrange(...)с range(...)в кодовую , а затем использовать другую подкладку , чтобы сделать синтаксис Python 3 совместим с Python 2:

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

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

Последнее предпочтительнее для кодовых баз, которые хотят быть совместимыми с Python 3 только в долгосрочной перспективе, тогда проще использовать синтаксис Python 3, когда это возможно.


8
Спасибо за замечание разницы между синтаксической ошибкой и исключением времени выполнения. Узнал что-то новое!
— Питикос,

17

добавить xrange=rangeв свой код :) Это работает для меня.


7
Как сказано в принятом ответе, не делайте этого, скорее всего, будут другие проблемы. Просто запустите этот код в Python 2.
— RobinFrcd

2
@ Мороз Сюй ... пожалуйста, примите к сведению Робина Фуркада и удалите свой ответ. Это IDE для новичков, и вы не хотите начинать с углубления в отладку и изучать только изменения Python 2/3. Вроде талия вашего времени.
— ZF007

10

Я решил проблему, добавив этот импорт
больше информации

from past.builtins import xrange

1
-------------------------------------------------- ------------------------- ModuleNotFoundError Traceback (последний вызов был последним) <ipython-input-21-bcd3600b3604> в <module> () - -> 1 из past.builtins импортировать xrange 2 для i в xrange (10): 3 print (i) ModuleNotFoundError: нет модуля с именем «past»
— rsc05

2

в python 2.x xrange используется для возврата генератора, а range - для возврата списка. В python 3.x xrange был удален, а range возвращает генератор точно так же, как xrange в python 2.x. Поэтому в Python 3.x вам нужно использовать range, а не xrange.



0

Я согласен с последним ответом. Но есть и другой способ решения этой проблемы. Вы можете скачать пакет с именем future, например, pip install future.And, в свой файл .py введите это "from past.builtins import xrange" .Этот метод для ситуации, когда в вашем файле много xranges.


Этот пакет будет использоваться для получения возможностей более новой версии для более старой версии Python. Не наоборот.
— Максим

Что past.builtings.rangeзначит просто установить xrangeссылку на range. Это полезно при создании кодовой базы полигонов Python 2/3, но не подходит для существующего проекта, который предназначен только для Python 2.
— Мартин Питерс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.