Python中__del__在VSCode自动触发Jupyter不触发的问题咨询
代码合法性说明
你编写的代码没有任何语法或逻辑问题,__del__方法的定义和使用都符合Python规范。
class Student: # constructor def __init__(self, name): print('Inside Constructor') self.name = name print('Object initialized') def show(self): print('Hello, my name is', self.name) # destructor def __del__(self): print('Inside destructor') print('Object destroyed') # create object s1 = Student('Emma') s2 = s1; s3 = s1; print("Id of S1: " , id(s1));
__del__方法的触发规则
__del__本质是Python垃圾回收的钩子函数,不是传统意义上的析构函数,仅当对象的引用计数归0时,才会在对象被回收前自动调用- 即便你没有手动执行
del删除引用,当Python进程退出时,解释器会销毁所有全局对象,此时对象引用计数会清零,__del__也会被触发
两个运行环境的差异原因
- VSCode运行逻辑:你在VSCode中运行的是独立Python脚本,脚本执行完毕后Python进程会直接退出,全局变量
s1、s2、s3全部失效,Student实例的引用计数降到0,__del__自然会被触发。VSCode本身不会干预Python的垃圾回收逻辑,所有回收动作都是Python解释器本身的默认行为。 - Jupyter Notebook运行逻辑:Jupyter采用常驻Python内核的交互式运行模式,单个代码Cell执行完成后内核不会退出,
s1、s2、s3三个变量仍保存在内核的全局命名空间中,Student实例的引用计数仍为3,不会被垃圾回收,因此__del__不会自动触发。如果你在Cell末尾手动执行del s1; del s2; del s3,再调用import gc; gc.collect()手动触发垃圾回收,就能看到__del__的输出。
内容的提问来源于stack exchange,提问作者DanishAnsari09
相关产品推荐
相关产品推荐

