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

dill序列化反序列化后列表内对象isinstance判断失败,是否为预期行为?

为什么dill反序列化后isinstance判断返回False?

这不是预期行为,问题根源在于dill对本地定义类的序列化机制:

  • 当你在脚本顶层定义MyClass并使用dill序列化其实例时,dill默认会把整个类的定义打包进序列化文件,而不是像pickle那样仅引用全局命名空间中的类对象。
  • 反序列化时,dill会根据打包的定义重新创建一个全新的类对象——这个新类和原MyClass代码完全一致,但内存地址不同。isinstance判断的核心是实例所属的类对象是否与传入的类对象为同一个(内存地址相等),所以反序列化后的实例和原MyClass做判断时会返回False。

而pickle不会出现这个问题,是因为它默认只序列化实例对类的全局名称引用,反序列化时直接从当前命名空间中获取原MyClass类对象,实例和原类属于同一个对象,isinstance自然返回True。

解决办法

  1. 使用byref=True参数
    强制dill像pickle一样引用全局命名空间中的类,而不是打包类定义:

    dill.dump(x, path.open('wb'), byref=True)
    

    这样反序列化后,实例所属的类就是原MyClass,isinstance(y[0], MyClass)会返回True。

  2. 将类放入独立模块
    把MyClass定义在单独的Python模块(比如my_classes.py)中,然后在脚本中导入使用。当类属于可导入模块时,dill会默认引用模块中的类对象,不会重新创建副本,反序列化后类对象一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:50:11