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.