【问题标题】:Why xrange is not defined when I'm not using xrange in the first place?当我首先不使用 xrange 时,为什么没有定义 xrange?
【发布时间】:2018-04-01 00:11:07
【问题描述】:

在下面的代码sn-p中,

if evaluation_data: 
    n_data = len(evaluation_data)
    n = len(training_data)
    evaluation_cost, evaluation_accuracy = [], []
    training_cost, training_accuracy = [], []
    for j in list(range(epochs)):
        random.shuffle(training_data)
        mini_batches = training_data[k:k+mini_batch_size]

你可以看到我没有使用xrange。虽然代码是为在pyhton2上运行而编写的,但我重构为在python3上运行它。但是,我不断收到以下错误:

................................Directory/network2.py", line 147, in SGD
    for j in list(range(epochs)):
NameError: name 'xrange' is not defined

一开始,我只使用了range()。然后在得知range() 不是python3 中的列表后,我做了list(range())。但是,在两种修改后的情况下,我不断收到xrange 的错误。如果有人可以提供帮助将不胜感激。

【问题讨论】:

    标签: python python-3.x list range


    【解决方案1】:

    您正在运行陈旧的字节码,请重新启动 Python。

    Python 将源代码编译为字节码,并解释后者。这意味着解释器一旦编译就不能使用源代码

    但是,我们人类不能很好地阅读字节码,所以当出现异常并且解释器希望我们了解哪里出错时,它会再次向您展示源代码。因此,当有要显示的回溯时,源代码会按需加载,并根据与字节码一起记录的信息从源代码中提取行。

    在您的情况下,您正在运行使用名称 xrange 的字节码。但是您已经更正了源代码以改用range。字节码抛出异常,Python 帮助从磁盘加载源代码,并显示已经更正的源代码

    解决方案是告诉 Python 通过重新启动来重新编译源代码。如果重新启动没有帮助,那么 Python 已经确定源代码比它缓存的字节码旧。删除源代码旁边的 __pycache__ 目录以清除字节码缓存,并删除可能与源代码位于同一目录中的所有 .pyc 文件。

    请注意,您可以放弃list() 电话;您不必有for 循环工作的列表; for j in range(epoch): 工作正常。

    【讨论】:

    • 我以为python不是编译语言。为什么它编译然后解释?它不应该同时解释源代码吗?或者我对编译语言和解释语言有错误的概念?
    • @KaliaDona 两者都可以。
    • @cᴏʟᴅsᴘᴇᴇᴅ 谢谢。我想理解是我的问题。
    • @KaliaDona:Python 有一个解释器循环,但该循环是由跨平台可移植字节码提供的。每当 Python 编译器第一次导入文件并且还没有字节码缓存(.pyc 文件)时,它都会生成该字节码。然而,它不是一个非常复杂的编译器。
    • @KaliaDona 查看this 问题和this 问题。
    猜你喜欢
    • 2013-02-07
    • 2016-03-29
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多