【问题标题】:Python 3 exception deletes variable in enclosing scope for unknown reason [duplicate]Python 3异常因未知原因删除封闭范围内的变量[重复]
【发布时间】:2015-05-29 21:42:37
【问题描述】:

我有以下代码:

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 中,第一行被打印,但第二行没有。它似乎删除了封闭范围内的变量,从最后一个打印语句给我以下回溯:

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 开发人员希望 except 块拥有自己的本地范围,并且不会泄漏到周围的范围中,我可以理解,但是为什么必须删除之前分配的外部范围中的变量呢?

【问题讨论】:

    标签: python exception python-3.x exception-handling


    【解决方案1】:

    引用documentation of try

    当使用as target 分配异常时,它会在except 子句的末尾被清除。这好像

    except E as N:
       foo
    

    被翻译成

    except E as N:
        try:
            foo
        finally:
            del N
    

    这意味着必须将异常分配给不同的名称,以便能够在 except 子句之后引用它。 异常被清除,因为附加了回溯,它们与堆栈帧形成一个引用循环,使该帧中的所有本地人保持活动状态,直到下一次垃圾回收发生

    这两个 PEP 都涵盖了这一点。

    1. PEP 3110 - Catching Exceptions in Python 3000

    2. PEP 344 - Exception Chaining and Embedded Tracebacks

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2016-11-13
    相关资源
    最近更新 更多