NameError: tên toàn cầu 'xrange' không được xác định trong Python 3


299

Tôi gặp lỗi khi chạy chương trình 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

Trò chơi là từ đây .

Điều gì gây ra lỗi này?

Câu trả lời:


570

Bạn đang cố chạy một cơ sở mã Python 2 với Python 3. xrange()đã được đổi tên thành range()Python 3.

Chạy trò chơi với Python 2 thay thế. Đừng cố gắng chuyển nó trừ khi bạn biết những gì bạn đang làm, rất có thể sẽ có nhiều vấn đề hơn xrange()so với range().

Đối với bản ghi, những gì bạn đang thấy không phải là lỗi cú pháp mà là ngoại lệ thời gian chạy thay thế.


Nếu bạn biết bạn đang làm gì và đang tích cực tạo ra một cơ sở mã Python 2 tương thích với Python 3, bạn có thể kết nối mã bằng cách thêm tên toàn cầu vào mô-đun của mình làm bí danh range. (Hãy tính đến việc bạn có thể phải cập nhật mọi range()sử dụng hiện có trong cơ sở mã Python 2 list(range(...))để đảm bảo bạn vẫn nhận được một đối tượng danh sách trong 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(...))

hoặc thay thế tất cả các sử dụng xrange(...)với range(...)trong cơ sở mã và sau đó sử dụng một shim khác để làm cho cú pháp Python 3 tương thích với Python 2:

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

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

Loại thứ hai thích hợp hơn cho các cơ sở mã muốn hướng tới tương thích Python 3 chỉ trong thời gian dài, sau đó chỉ cần sử dụng cú pháp Python 3 bất cứ khi nào có thể.


8
Cảm ơn bạn đã lưu ý sự khác biệt giữa lỗi cú pháp và ngoại lệ thời gian chạy. Đã học được điều gì đó mới!
Pithikos

17

thêm xrange=rangevào mã của bạn :) Nó hoạt động với tôi.


7
Như đã nói trong câu trả lời được chấp nhận, đừng làm vậy, có khả năng sẽ có những vấn đề khác. Chỉ cần chạy mã đó trong python 2.
RobinFrcd

2
@Frost Xu ... vui lòng xem xét Robin Fourcade nhận xét của anh ấy và xóa câu trả lời của bạn. Đó là một IDE cho người mới bắt đầu và bạn không muốn bắt đầu với việc đi sâu vào gỡ lỗi và chỉ tìm hiểu về 2/3 thay đổi của python. Kinda eo của thời gian của bạn.
ZF007

10

Tôi đã giải quyết vấn đề bằng cách thêm nhập này
Thông tin thêm

from past.builtins import xrange

1
-------------------------------------------------- ------------------------- ModuleNotFoundError TracBack (cuộc gọi gần đây nhất vừa qua) <ipython-input-21-bcd3600b3604> trong <module> () - -> 1 từ past.builtins nhập xrange 2 cho i trong xrange (10): 3 in (i) ModuleNotFoundError: Không có mô-đun nào có tên 'quá khứ'
rsc05

2

trong python 2.x, xrange được sử dụng để trả về một trình tạo trong khi phạm vi được sử dụng để trả về một danh sách. Trong python 3.x, xrange đã bị xóa và phạm vi trả về một trình tạo giống như xrange trong python 2.x. Do đó, trong python 3.x bạn cần sử dụng phạm vi thay vì xrange.


1

Thay thế

Python 2 xrangeđến

Con trăn 3 range

Nghỉ ngơi tất cả như nhau.


0

Tôi đồng ý với câu trả lời cuối cùng. Nhưng có một cách khác để giải quyết vấn đề này. Bạn có thể tải xuống gói có tên tương lai, chẳng hạn như cài đặt pip tương lai. Và trong tệp .py của bạn nhập "từ past.builtins nhập xrange". Phương thức này dành cho tình huống có nhiều xranges trong tệp của bạn.


Gói này được sử dụng để có được các tính năng của phiên bản mới hơn với phiên bản cũ hơn của python. Không có cách khác xung quanh.
mcsim

Những gì past.builtings.rangekhông chỉ đơn giản là được thiết lập xrangeđể tham khảo range. Điều này hữu ích khi tạo một cơ sở mã đa năng Python 2/3, nhưng không phù hợp với một dự án hiện có được thiết kế để chỉ hoạt động trên Python 2.
Martijn Pieters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.