我读到PYHTON将回收ID,这意味着一个新的对象可能会以先前存在且已损坏的对象的ID结束.我还读到了大约pickle本书:
pickle模块跟踪它已经序列化的对象,这样以后对同一对象的引用就不会再次序列化.法警不会这么做的.
如果我持有打开的Pickler
的一个实例几分钟,在信息进入时写入单个文件,并在调用Pickler.dump(obj)
后立即丢弃它,会不会有这样的风险:新的obj
将被赋予同一文件中已写入的另一个的ID,因此意外地写入了错误的内容?
我读到PYHTON将回收ID,这意味着一个新的对象可能会以先前存在且已损坏的对象的ID结束.我还读到了大约pickle本书:
pickle模块跟踪它已经序列化的对象,这样以后对同一对象的引用就不会再次序列化.法警不会这么做的.
如果我持有打开的Pickler
的一个实例几分钟,在信息进入时写入单个文件,并在调用Pickler.dump(obj)
后立即丢弃它,会不会有这样的风险:新的obj
将被赋予同一文件中已写入的另一个的ID,因此意外地写入了错误的内容?
没有发生这种情况的风险,因为备忘录dict
和includes是有问题的对象;它的生命周期不会结束,直到酸洗完成并且备忘录词典被清理.
具体地说,在当前的实现中,记忆词典将对象的id
映射到2-tuple
,其中第一个元素是第二次写入记忆值时要使用的索引,第二个元素是值本身.根据函数中的注释,这是设计的一个特意部分,声明:
该对象存储在Pickler备忘录中,以便在酸洗过程中保持瞬时对象的活动状态.