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

Гра звідси .

Що викликає цю помилку?

Відповіді:


570

Ви намагаєтеся запустити базу коду Python 2 з Python 3. xrange()був перейменований range()в Python 3.

Запустіть гру замість Python 2. Не намагайтеся перенести його , якщо ви не знаєте , що ви робите, швидше за все , буде більше проблем поза xrange()VS. 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
@Frost Xu ... будь ласка, врахуйте його коментар Робіна Фуркада та видаліть свою відповідь. Це IDE для початківців, і ви не хочете починати з занурення вглиб налагодження і тільки дізнаєтесь про зміни python 2/3. Ніби талія вашого часу.
ZF007

10

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

from past.builtins import xrange

1
-------------------------------------------------- ------------------------- Відстеження модуляNotFoundError (останній дзвінок останній) <ipython-input-21-bcd3600b3604> в <module> () - -> 1 з past.builtins import xrange 2 for i in xrange (10): 3 print (i) ModuleNotFoundError: Немає модуля з назвою "минулий"
rsc05

2

у python 2.x, xrange використовується для повернення генератора, тоді як діапазон використовується для повернення списку. У python 3.x xrange було видалено, а діапазон повертає генератор так само, як xrange у python 2.x. Тому в python 3.x потрібно використовувати діапазон, а не xrange.



0

Я погоджуюсь з останньою відповіддю. Але є інший спосіб вирішити цю проблему. Ви можете завантажити пакет з назвою майбутнього, наприклад, встановити файл pip future.і у свій .py файл введіть це "з past.builtins import xrange" .Цей метод - це ситуація, коли у вашому файлі багато xranges.


Цей пакет повинен використовуватися для отримання особливостей нової версії до старій версії python. Не навпаки.
mcsim

Те, past.builtings.rangeщо робиться, просто встановлюється xrangeяк посилання на range. Це корисно при створенні коди бази поліглотів Python 2/3, але не підходить для існуючого проекту, призначеного для роботи лише на Python 2.
Martijn Pieters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.