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.

Ахмад Фархан
источник
1

замещать

Python 2 xrangeдля

Python 3 range

Отдыхай все же.

Harry_pb
источник
0

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

Не гений
источник
Этот пакет будет использоваться для получения возможностей более новой версии для более старой версии Python. Не наоборот.
Максим
Что past.builtings.rangeзначит просто установить xrangeссылку на range. Это полезно при создании кодовой базы полигонов Python 2/3, но не подходит для существующего проекта, который предназначен только для Python 2.
Мартин Питерс