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.