Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1052671
  • 博文数量: 836
  • 博客积分: 43880
  • 博客等级: 大将
  • 技术积分: 5485
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-20 17:36
文章分类

全部博文(836)

文章存档

2011年(1)

2008年(835)

我的朋友

分类: LINUX

2008-08-20 18:26:30









相等,但并不总是相同 正如在上一个示例所暗示的,只有在这些对象引用内存中同一个对象时,它们才是相同的。在pickle情形中,每个对象被恢复到一个与原来对象相等的对象,但不是同一个对象。换句话说,每个pickle都是原来对象的一个副本:
  >>>j=[1,2,3]
  >>>k=j
  >>>kisj
  1
  >>>x=pickle.dumps(k)
  >>>y=pickle.loads(x)
  >>>y
  [1,2,3]
  >>>y==k
  1
  >>>yisk
  0
  >>>yisj
  0
  >>>kisj
  1
  
清单8.作为原来对象副本的被恢复的对象
同时,我们看到Python能够维护对象之间的引用,这些对象是作为一个单元进行pickle的。然而,我们还看到分别调用dump()会使Python无法维护对在该单元外部进行pickle的对象的引用。相反,Python复制了被引用对象,并将副本和被pickle的对象存储在一起。对于pickle和恢复单个对象层次结构的应用程序,这是没有问题的。但要意识到还有其它情形。 值得指出的是,有一个选项确实允许分别pickle对象,并维护相互之间的引用,只要这些对象都是pickle到同一文件即可。pickle和cPickle模块提供了一个Pickler(与此相对应是Unpickler),它能够跟踪已经被pickle的对象。通过使用这个Pickler,将会通过引用而不是通过值来pickle共享和循环引用:
  >>>f=file(''temp.pkl'',''w'')
  >>>pickler=pickle.Pickler(f)
  >>>pickler.dump(a)
  
  >>>pickler.dump(b)
  
  >>>f.close()
  >>>f=file(''temp.pkl'',''r'')
  >>>unpickler=pickle.Unpickler(f)
  >>>c=unpickler.load()
  >>>d=unpickler.load()
  >>>c[2]
  [3,4,[1,2,[...]]]
  >>>d[2]
  [1,2,[3,4,[...]]]
  >>>c[2]isd
  1
  >>>d[2]isc
  1
  
清单9.维护分别pickle的对象间的引用
不可pickle的对象 一些对象类型是不可pickle的。例如,Python不能pickle文件对象(或者任何带有对文件对象引用的对象),因为Python在unpickle时不能保证它可以重建该文件的状态(另一个示例比较难懂,在这类文章中不值得提出来)。试图pickle文件对象会导致以下错误:
  >>>f=file(''temp.pkl'',''w'')
  >>>p=pickle.dumps(f)
  Traceback(mostrecentcalllast):
  File"",line1,in?
  File"/usr/lib/python2.2/copy_reg.py",line57,in_reduce
  raiseTypeError,"can''tpickle%sobjects"%base.__name__
  TypeError:can''tpicklefileobjects
  
清单10.试图pickle文件对象的结果
1 2 3 4 下一页>>


下载本文示例代码
阅读(364) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~