【问题标题】:NameError: global name 'xrange' is not defined in Python 3NameError:Python 3 中未定义全局名称“xrange”
【发布时间】:2013-06-19 13:13:04
【问题描述】:

运行 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

游戏来自here

是什么导致了这个错误?

【问题讨论】:

    标签: python python-3.x range runtimeexception xrange


    【解决方案1】:

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

    改为使用 Python 2 运行游戏。除非您知道自己在做什么,否则不要尝试移植它,很可能除了xrange()range() 之外还有更多问题。

    为了记录,您看到的不是语法错误,而是运行时异常。


    如果您确实知道自己在做什么并且正在积极制作与 Python 3 兼容的 Python 2 代码库,则可以通过将全局名称添加到您的模块作为 range 的别名来桥接代码。 (考虑到您可能必须使用list(range(...)) 更新 Python 2 代码库中任何现有的 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 语法会更容易。

    【讨论】:

    • 感谢您注意语法错误和运行时异常之间的区别。学到了新东西!
    • 嗯,这可能是一个很好的兼容性解决方案,但xrange 的设计理念是memory efficiency。只需尝试使用数百万长度的 range 对象而不是 xrange 对象。
    • @gabrielgarcia 这就是为什么代码在 Python 2 中为您提供 xrange 在 Python 3 中为您提供 range。这些是那些 Python 版本的内存高效虚拟序列。
    【解决方案2】:

    在你的代码中添加xrange=range :) 它对我有用。

    【讨论】:

    • 正如在接受的答案中所说,不要这样做,可能会有其他问题。只需在 python 2 中运行该代码。
    • @Frost Xu ...请考虑 Robin Fourcade 他的评论并删除您的答案。它是一个适合初学者的 IDE,您不想一开始就深入调试,而只了解 python 2/3 的变化。有点浪费你的时间。
    【解决方案3】:

    我通过添加这个导入解决了这个问题
    更多info

    from past.builtins import xrange
    

    【讨论】:

    • ------------------------------------------ --------------------------------- ModuleNotFoundError Traceback(最近一次调用最后)() ----> 1 from past.builtins import xrange 2 for i in xrange(10): 3 print(i) ModuleNotFoundError: No module named 'past'
    • @rsc05 你必须回到未来! pip3 install future
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      替换

      Python 2 xrange

      Python 3 range

      一切都一样。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 这个包用于将新版本的功能获取到旧版本的python。不是其他方式。
        • past.builtings.range 所做的只是将xrange 设置为对range 的引用。这在创建 Python 2 / 3 多语言代码库时很有帮助,但不适用于仅适用于 Python 2 的现有项目。
        猜你喜欢
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-21
        • 2022-02-24
        • 2012-03-28
        相关资源
        最近更新 更多