当前位置: 首页 > 面试题库 >

Python 3异常出于未知原因在封闭范围内删除变量

邓兴为
2023-03-14
问题内容

我有以下代码:

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

几乎就像del e在该except块之后插入了一条语句。这种行为有什么道理吗?如果Python开发人员希望除块之外的其他块具有自己的局部作用域,并且不泄漏到周围的作用域中,那么我能理解它,但是为什么它必须删除先前分配的外部作用域中的变量?


问题答案:

引用的文档try

使用分配了异常后as target,将在except子句的末尾将其清除。好像

except E as N:
   foo

被翻译成

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

这意味着必须将异常分配给其他名称,以便能够在except子句之后引用该异常。
清除异常是因为它们具有附加的回溯,它们与堆栈框架形成了一个参考循环,使该框架中的所有局部变量都保持活动状态,直到发生下一个垃圾回收为止

这两个PEP对此进行了介绍。

  1. PEP 3110-Python 3000中的捕获异常

  2. PEP 344-异常链接和嵌入式回溯



 类似资料:
  • 问题内容: 为什么使用lambda函数来获取值列表i = 4。在调用lambda期间,不存在封闭范围。函数f已经完成工作并返回了控制(变量i不存在)。 问题答案: Python使用闭包捕获对原始变量的引用。这些对象保留对名称的引用,可以通过该引用访问值。这意味着变量在完成后将继续存在。 您可以在lambda对象的元组中内省此闭包;函数具有相同的属性: 这也是列表中 所有 lambda 都引用val

  • 问题内容: 我有以下代码: 我的索引超出范围错误,我不知道为什么。我声明了大小为10的尺寸。为什么会出现此错误? 问题答案: 您声明了一个,其初始容量为10个元素,但没有向此列表中添加元素,即列表为空。将替换现有元素,但是由于列表中没有元素,因此将引发异常。您必须使用方法在之前添加元素。 表示列表内部维护的数组的开头大小为10。在列表中添加更多元素时,此内部数组的大小可能会更改。

  • 本文向大家介绍在Python中删除范围内的元素,包括了在Python中删除范围内的元素的使用技巧和注意事项,需要的朋友参考一下 通过使用元素的索引和del函数,可以直接从python删除单个元素。但是在某些情况下,我们需要删除一组索引的元素。本文探讨了仅删除索引列表中指定的列表中那些元素的方法。 使用排序和删除 在这种方法中,我们创建一个包含必须删除的索引值的列表。我们对它们进行排序和反转以保留列

  • 问题内容: 我正在阅读“ CreateSpace Go 2012编程入门” 在第86页上,我发现了这种邪恶的魔力 1)为什么不复位?2)正在返回,或者是否如此聪明以至于它可以与所有东西配合使用? 问题答案: 为了清楚起见,我将为这两个函数分配名称: 工厂返回闭包–函数是Go中的一等公民,即它们可以是右手表达式,例如: 在您的代码中,闭包环绕工厂的上下文,这称为 词法作用域 。这就是变量在闭包内部可

  • 我使用Sqoop将数据从SQL server导入到本地HDF。我使用一个简单的自由形式查询从表中提取大约10行。下面是我从终端执行的sqoop命令: 当我从本地计算机执行此操作时,会出现以下异常: 原因:com。微软sqlserver。jdbc。SQLServerException:索引2超出范围。在com。微软sqlserver。jdbc。SQLServerException。在com上生成fr

  • 我想模拟我的 PermissionHostCompat 类的 action 我是这样做的: 它给我抛出了错误: org . mock ITO . exceptions . misusing . invaliduseofmatchersexception:< br >参数匹配器的使用无效!< br >预期有0个匹配者,记录了2个: 如果匹配器与原始值组合,则可能会出现此异常:/ /不正确: some