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

游戏是从这里开始的

是什么导致此错误?

Answers:


570

您正在尝试使用Python 3运行Python 2代码库。在Python 3中xrange()已重命名为range()

而是使用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 2的Python语法3兼容:

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
感谢您注意到语法错误和运行时异常之间的区别。学到新东西!
Pithikos 2014年

17

添加xrange=range您的代码:)对我有用。


7
就像在已接受的答案中所说的那样,不要这样做,很可能还会有其他问题。只需在python 2中运行该代码
即可。– RobinFrcd

2
@Frost Xu ...请考虑Robin Fourcade的评论,并删除您的答案。它是面向初学者的IDE,您不想开始深入调试,而只了解python 2/3的更改。您的时间有点腰。
ZF007

10

我加入这个解决进口问题的
更多信息

from past.builtins import xrange

1
-------------------------------------------------- ------------------------- ModuleNotFoundError追溯(最近一次调用最近)<module>()中的<ipython-input-21-bcd3600b3604>- ->从past.builtins中的1为xrange(10)中的i导入xrange 2:3 print(i)ModuleNotFoundError:没有名为“ past”的模块
rsc05

2

在python 2.x中,xrange用于返回生成器,而range用于返回列表。在python 3.x中,xrange已被删除,并且range返回一个生成器,就像python 2.x中的xrange一样。因此,在python 3.x中,您需要使用range而不是xrange。


1

更换

Python 2 xrange

Python 3 range

休息都一样。


0

我同意最后一个答案。但是还有另一种方法可以解决此问题。您可以下载名为future的软件包,例如pip install future。然后在.py文件中输入“ from past.builtins import xrange”。此方法用于文件中有很多xrange的情况。


该软件包用于获取新版本的功能到旧版本的python。没有其他办法。
mcsim

什么past.builtings.range确实是简单的设置xrange来做个参考range。这在创建Python 2/3多语言代码库时很有用,但不适用于旨在仅在Python 2上运行的现有项目。
马丁·皮特斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.