NameError: nama global 'xrange' tidak didefinisikan dalam Python 3

299

Saya mendapatkan kesalahan saat menjalankan program 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

Permainannya dari sini .

Apa yang menyebabkan kesalahan ini?

Pip
sumber

Jawaban:

571

Anda mencoba menjalankan basis kode Python 2 dengan Python 3. xrange()diubah namanya menjadi range()Python 3.

Jalankan game dengan Python 2 sebagai gantinya. Jangan mencoba untuk port kecuali Anda tahu apa yang Anda lakukan, kemungkinan besar akan ada lebih banyak masalah di luar xrange()vs range().

Sebagai catatan, apa yang Anda lihat bukan kesalahan sintaks tetapi pengecualian runtime.


Jika Anda tahu apa yang Anda lakukan dan secara aktif membuat basis kode Python 2 yang kompatibel dengan Python 3, Anda dapat menjembatani kode tersebut dengan menambahkan nama global ke modul Anda sebagai alias untuk range. (Mempertimbangkan bahwa Anda mungkin harus memperbarui setiap range()penggunaan yang ada dalam basis kode Python 2 dengan list(range(...))untuk memastikan Anda masih mendapatkan objek daftar di 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(...))

atau ganti semua penggunaan xrange(...)dengan range(...)dalam basis kode dan kemudian gunakan shim yang berbeda untuk membuat sintaks Python 3 kompatibel dengan Python 2:

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

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

Yang terakhir lebih disukai untuk basis kode yang ingin bertujuan menjadi Python 3 yang kompatibel hanya dalam jangka panjang, lebih mudah untuk kemudian hanya menggunakan sintaks Python 3 bila memungkinkan.

Martijn Pieters
sumber
8
Terima kasih telah mencatat perbedaan antara kesalahan sintaks dan pengecualian runtime. Belajar sesuatu yang baru!
Pithikos
17

tambahkan xrange=rangekode Anda :) Ini berfungsi untuk saya.

Frost Xu
sumber
7
Seperti yang dikatakan dalam jawaban yang diterima, jangan lakukan itu, kemungkinan akan ada masalah lain. Jalankan saja kode itu dengan python 2.
RobinFrcd
2
@ Frost Xu ... harap pertimbangkan Robin Fourcade komentarnya dan hapus jawaban Anda. Ini adalah IDE untuk pemula dan Anda tidak ingin memulai dengan menyelam jauh ke dalam debugging dan hanya belajar tentang perubahan python 2/3. Kurangi pinggang waktu Anda.
ZF007
10

Saya memecahkan masalah dengan menambahkan impor ini Info
lainnya

from past.builtins import xrange
Andrés Gutiérrez
sumber
1
-------------------------------------------------- ------------------------- ModuleNotFoundError Traceback (panggilan terakhir terakhir) <ipython-input-21-bcd3600b3604> dalam <module> () - -> 1 dari past.builtins mengimpor xrange 2 untuk saya di xrange (10): 3 cetak (i) ModuleNotFoundError: Tidak ada modul bernama 'masa lalu'
rsc05
2

di python 2.x, xrange digunakan untuk mengembalikan generator sedangkan range digunakan untuk mengembalikan daftar. Di python 3.x, xrange telah dihapus dan range mengembalikan generator seperti xrange di python 2.x. Oleh karena itu, dalam python 3.x Anda perlu menggunakan rentang daripada xrange.

Ahmad Farhan
sumber
1

Menggantikan

Python 2 xrangehingga

Python 3 range

Istirahat semua sama.

Harry_pb
sumber
0

Saya setuju dengan jawaban terakhir. Tapi ada cara lain untuk menyelesaikan masalah ini. Anda dapat mengunduh paket bernama future, seperti pip install future. Dan dalam file .py Anda masukkan ini "from past.builtins import xrange". Metode ini untuk situasi yang ada banyak xranges di file Anda.

Bukan Genius
sumber
Paket ini akan digunakan untuk mendapatkan fitur dari versi yang lebih baru ke versi python yang lebih lama. Tidak sebaliknya.
mcsim
Apa yang past.builtings.rangedilakukan hanya diatur xrangesebagai referensi range. Ini membantu ketika membuat Python 2/3 polyglot codebase, tetapi tidak cocok untuk proyek yang sudah ada yang dirancang untuk bekerja pada Python 2 saja.
Martijn Pieters