UnboundLocalError:赋值前引用了局部变量“e”

0dm*_*mda 5 python exception python-3.x

为什么这段代码不起作用?

def test():   
    e = None
    try:
        raise Exception

    except Exception as e:
        pass

    return e

test()
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

UnboundLocalError:赋值前引用了局部变量“e”

che*_*ner 10

当异常被捕获并绑定到一个名称时,该名称会在try语句之后被清除。从声明文档中try

except E as N:
    foo
Run Code Online (Sandbox Code Playgroud)

行为与

except E as N:
    try:
        foo
    finally:
        del N
Run Code Online (Sandbox Code Playgroud)

因此,如果捕获到异常,则e一旦return e到达就不再存在。这被描述为是为了打破堆栈帧(包含对 的引用e)和被引用的回溯(包含对堆栈帧的引用)之间的引用循环e

  • 出色的答案。这向我展示了关于Python是如何实现的,有多少小事情和细节对我来说仍然是未知的。 (5认同)