为什么删除中使用的变量

时间:2014-08-20 22:31:43

标签: python python-3.x

为什么删除except语句中使用的变量?我的意思是:

x = 0

try:
  x = 5/0
except ZeroDivisionError as x:
  pass

print(x)

我得到NameError: name 'x' is not defined为什么会这样?它不能像def一样工作或理解如果在封闭函数(或模块)中有一个变量具有相同名称的变量,它只是被遮蔽但不被删除?

2 个答案:

答案 0 :(得分:4)

行为记录在案here

  

如果使用as作为目标分配了异常,则在except子句的末尾清除它。

     

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

答案 1 :(得分:4)

the documentation(我添加的 [] 大括号中的部分)对此进行了解释:

  

使用as target 分配例外时[即]在你的情况下as x] ,它在except子句的末尾被清除。这就好像

except E as N:
    foo
  

被翻译为:

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

这意味着必须将例外分配给不同的名称才能引用它 [即。这个名称,在您的情况下为x] 在except子句之后。

还说明了原因:

  

异常被清除,因为附加了回溯,它们与堆栈帧形成一个引用循环,保持该帧中的所有本地生存,直到下一次垃圾收集发生。