Python 为什么删除except中使用的变量

Python 为什么删除except中使用的变量,python,python-3.x,Python,Python 3.x,为什么删除except语句中使用的变量?我的意思是: x = 0 try: x = 5/0 except ZeroDivisionError as x: pass print(x) 我得到name错误:没有定义名称“x”为什么?它不能像使用def或理解时那样工作吗?如果在封闭函数(或模块)中有一个与变量同名的变量,它只是被隐藏,但没有被删除?记录了该行为: 使用as target分配异常后,将在except子句末尾清除该异常 这意味着必须将异常分配给不同的名称,以便能够在excep

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

x = 0

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

print(x)

我得到
name错误:没有定义名称“x”
为什么?它不能像使用
def
或理解时那样工作吗?如果在封闭函数(或模块)中有一个与变量同名的变量,它只是被隐藏,但没有被删除?

记录了该行为:

使用as target分配异常后,将在except子句末尾清除该异常

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

(我添加的括号中的部分)对此进行了解释:

当使用
作为目标分配了异常时,
[即在您的情况下,
作为x
将在except子句末尾清除该异常。这就好像

翻译为:

这意味着必须将异常分配给另一个名称,以便能够在EXPECT子句之后引用它

原因也说明如下:

异常会被清除,因为通过附加到它们的回溯,它们与堆栈帧形成一个引用循环,使该帧中的所有局部变量保持活动状态,直到下一次垃圾回收发生

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