Python “收到”;UnboundLocalError:局部变量';e';作业前参考“;初始化变量时

Python “收到”;UnboundLocalError:局部变量';e';作业前参考“;初始化变量时,python,exception,exception-handling,python-3.x,while-loop,Python,Exception,Exception Handling,Python 3.x,While Loop,[社区编辑以提供可复制的示例: def main(): e = None print(locals()) while not e: try: raise Exception except Exception as e: pass main() 产生 ~/coding$ python3.3 quiz2.py {'e': None} Traceback (most re

[社区编辑以提供可复制的示例:

def main():
    e = None
    print(locals())
    while not e:
        try:
            raise Exception
        except Exception as e:
            pass            

main()
产生

~/coding$ python3.3 quiz2.py
{'e': None}
Traceback (most recent call last):
  File "quiz2.py", line 11, in <module>
    main()
  File "quiz2.py", line 5, in main
    while not e:
UnboundLocalError: local variable 'e' referenced before assignment
完整的代码如下:
https://www.dropbox.com/s/llj5xwexzfsoppv/stats_quiz_feb24_2013.py

它所需的数据文件(用于运行测验)位于以下链接中:
https://www.dropbox.com/s/70pbcb80kss2k9e/stats_quiz.dat

main()
需要编辑才能使用正确的数据文件地址:

下面是我收到的完整错误消息。这很奇怪,因为我在while循环之前初始化了
e
。我希望有人能帮我解决这个问题。谢谢

Traceback (most recent call last):
  File "<pyshell#217>", line 1, in <module>
    main()
  File "/Users/Dropbox/folder/stats_quiz_feb24_2013.py", line 83, in main
    while not e:
UnboundLocalError: local variable 'e' referenced before assignment
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
main()
文件“/Users/Dropbox/folder/stats\u quick\u feb24\u 2013.py”,第83行,主文件
虽然不是e:
UnboundLocalError:赋值前引用了局部变量“e”

嗯,我不知道是什么导致了实际的问题,但是当出现异常时,为什么不直接使用
break
?您的循环变成:

while True:
    try:
        score = pickle.load(score_list)
        name = pickle.load(score_list)
        score_name.append([score, name])
    except EOFError as e:
        break
据我所知,这是实现“无例外运行循环”的惯用方法

编辑:为什么会发生这种情况

在python3中,一旦退出异常处理程序的作用域,异常绑定到的变量就会从名称空间中删除。我将代码修改为以下内容:

def main():
    e = None
    print(locals())
    while not e:
        try:
            raise Exception
        except Exception as e:
            pass
        print(locals())

main()
输出:

{'e': None}
{}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in main
UnboundLocalError: local variable 'e' referenced before assignment
将生成以下输出:

{'e': None}
{'e': Exception()}

但是您确实不应该为您的特定用例这样做。

此错误是由新的
try…引起的,除了…
scope,它是Python 3的一个特性。

在Python3中,以下代码块

try:
    try_body
except E as N:
    except_body
...
转换为(用Python 2.5术语)

因此,在Python3中,这个函数

def main():
    e = None
    print(locals())
    while not e:
        try:
            raise Exception
        except Exception as e:
            pass
相当于

def main():
    e = None
    print(locals())
    if not e:
        try:
            raise Exception
        except Exception as e:
            pass
        del e
    if not e:
        try:
            raise Exception
        except Exception as e:
            pass
        del e
    ...
e
已初始化,但在第一个
块之后,它已被删除

因此,
UnboundLocalError
是不允许的。

放在一边:行
score\u name=score=name=[]
可能不会像您认为的那样。它不制作三个列表,而是制作一个列表,并绑定三个名称。在控制台尝试,然后
score.append(3);打印(分数、分数、名称)
。这在这里可能并不重要,因为你重新绑定了
分数
名称
,但仍然如此。呃,我完全忘记了引用的问题(来自R,它没有这个问题)。谢谢你指出这一点!无法复制。请提供一个最小的自包含的示例。我不知道如何复制它-代码中一定有我们看不到的东西。您是否可以尝试制作一个可复制的示例,即可以运行并产生此错误的代码的简短版本?(很可能在这样做的过程中,您首先会发现问题的原因)。完整的代码对我来说很有用。请提供一个最小的失败代码,而不是这个怪物。谢谢你的简单解决方案和解释!考虑到我使用python3的经验有限,Nymk的回答比我的解释更好地解释了为什么会发生这种情况。如果你有时间阅读的话,他链接到的PEP特别具有指导意义:)我没有太多地使用python3(我现在仍然停留在python2的老方法中)。谢谢你的解释:)我猜问题的语义从python2变为python3,但我不知道到底是怎么回事。谢谢你的解释!我刚开始使用Python,我的朋友告诉我3和2之间有很多不方便的区别。(我的朋友们只使用python 2)
try:
    try_body
except E, N:
    try:
        except_body
    finally:
        N = None
        del N
...
def main():
    e = None
    print(locals())
    while not e:
        try:
            raise Exception
        except Exception as e:
            pass
def main():
    e = None
    print(locals())
    if not e:
        try:
            raise Exception
        except Exception as e:
            pass
        del e
    if not e:
        try:
            raise Exception
        except Exception as e:
            pass
        del e
    ...