Python except块错误别名赋值为自身外部访问报NameError原因求解
两段except代码执行结果差异的底层原理
这个差异是Python 3对except块绑定的异常变量的特殊生命周期规则直接导致的:
- 当使用
except 异常类型 as 变量名语法捕获异常时,该绑定的变量仅在except代码块的作用域内有效。一旦程序执行流程离开except块,Python会自动将这个变量从当前作用域中删除,无论你在块内对该变量做了何种赋值操作。这个设计的初衷是避免异常对象持有栈帧引用,导致关联的内存对象无法被垃圾回收,造成不必要的内存占用。
接下来分别解释两段代码的执行逻辑:
- 第一段可正常运行的代码
try: raise Exception('oh no!') except Exception as e: error = e print(error) # prints "oh no!"
在except块内,你将异常绑定变量e指向的异常对象赋值给了独立的新变量error,error不属于except语法绑定的异常变量,因此不会在退出except块时被自动清理,外部可以正常访问。
- 第二段运行失败的代码
try: raise Exception('oh no!') except Exception as e: e = e print(e) # NameError: name 'e' is not defined
你在块内仅对except绑定的变量e本身做了无意义的自赋值操作,e依然是except语法绑定的异常变量,退出except块时会被Python自动删除,因此外部访问e会触发NameError。
内容的提问来源于stack exchange,提问作者actual_panda
相关产品推荐
相关产品推荐

