为什么删除except
语句中使用的变量?我的意思是:
x = 0
try:
x = 5/0
except ZeroDivisionError as x:
pass
print(x)
我得到NameError: name 'x' is not defined
为什么会这样?它不能像def
一样工作或理解如果在封闭函数(或模块)中有一个变量具有相同名称的变量,它只是被遮蔽但不被删除?
答案 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子句之后。
还说明了原因:
异常被清除,因为附加了回溯,它们与堆栈帧形成一个引用循环,保持该帧中的所有本地生存,直到下一次垃圾收集发生。