You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python的__del__方法为何在VS Code与Jupyter中运行表现不一致?

Python __del__方法跨环境表现差异的原因

测试代码如下:

class test:
    def __init__(self) :
        print("init")
    def __del__(self):
        print("del")
a=test()

首先明确核心前提:Python里的__del__不是C++那种离开作用域就确定性执行的析构函数,它仅在对象被垃圾回收器判定为无任何有效引用、即将被回收时才会执行,触发时机完全由对应运行环境的解释器生命周期、垃圾回收策略决定,语言规范本身不强制保证它的执行时机,不同环境出现表现差异是正常现象。

两类运行环境的差异逻辑

  • VS Code脚本运行场景
    VS Code运行Python脚本时,会启动一个独立的一次性Python解释器进程执行全量脚本代码。当脚本执行到末尾、进程准备退出时,解释器会统一清理全局作用域的所有存活对象:代码里定义的全局变量a持有的test类实例引用会被释放,引用计数降到0,垃圾回收器回收该实例时就会触发__del__方法,因此会打印del。
  • Jupyter Notebook运行场景
    Jupyter Notebook采用长期驻留的内核模式执行代码,单个单元格执行完成后,内核进程不会退出,单元格内定义的全局变量会一直保存在内核的全局命名空间里,直到你手动删除变量、重启内核或者显式触发垃圾回收。运行完测试代码后,变量a始终持有test实例的有效引用,实例不会被回收,自然不会触发__del__打印del。

实用提醒

  • 别在业务代码里依赖__del__做必须落地的资源释放操作(比如关闭文件、释放数据库连接),循环引用、解释器异常退出等很多场景都会导致__del__不执行。要做确定性的资源释放,用上下文管理器(with语法)才是靠谱的方案。
  • 如果想在Jupyter里复现VS Code的输出,只要在代码最后加del a,再调用gc.collect()手动触发垃圾回收,就能看到del的打印结果。

内容的提问来源于stack exchange,提问作者user17169456

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.05 16:15:46