首页 文章

Python 3异常删除封闭范围内的变量,原因不明

提问于
浏览
10

我有以下代码:

def foo():
    e = None
    try:
        raise Exception('I wish you would except me for who I am.')
    except Exception as e:
        print(e)
    print(e)

foo()

在Python 2.7中,它按预期运行并打印:

I wish you would except me for who I am.
I wish you would except me for who I am.

但是在Python 3.x中,第一行是打印的,但第二行不是 . 它似乎删除了封闭范围中的变量,从最后一个print语句给出了以下回溯:

Traceback (most recent call last):
  File "python", line 9, in <module>
  File "python", line 7, in foo
UnboundLocalError: local variable 'e' referenced before assignment

几乎就像在 except 块之后插入 del e 语句一样 . 这种行为有什么理由吗?我可以理解,如果Python开发人员想要除了块有自己的本地范围,而不是泄漏到周围的范围,但为什么必须删除以前分配的外部范围中的变量?

1 回答

  • 12

    引用documentation of try

    使用as作为目标分配异常时,将在except子句的末尾清除该异常 . 这就像E除N:
    FOO
    被翻译为E除N:
    尝试:
    FOO
    最后:
    德尔N.
    这意味着必须将异常分配给其他名称才能在except子句之后引用它 . 异常被清除,因为附加了回溯,它们与堆栈框架形成一个引用循环,使该框架中的所有本地生存,直到下一次垃圾收集发生 .

    这包括在这两个PEP中 .

相关问题