首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pickle链接对象

Pickle链接对象
EN

Stack Overflow用户
提问于 2011-06-17 01:31:10
回答 3查看 2.8K关注 0票数 13

我想要pickle一个对象和引用第一个对象的第二个对象。当我幼稚地对这两个对象进行pickle/unpickle时,引用变成了副本。如何保留两个对象foobar.foo_ref之间的链接

代码语言:javascript
复制
import pickle

class Foo(object):
    pass

foo = Foo()
bar = Foo()
bar.foo_ref = foo

with open('tmp.pkl', 'wb') as f:
    pickle.dump(foo, f)
    pickle.dump(bar, f)
with open('tmp.pkl', 'rb') as f:
    foo2 = pickle.load(f)
    bar2 = pickle.load(f)

print id(foo) == id(bar.foo_ref) # True
print id(foo2) == id(bar2.foo_ref) # False
# want id(foo2) == id(bar2.foo_ref)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-17 01:55:27

我之前的回答没有抓住你的意思。代码的问题在于没有使用PicklerUnpickler对象。下面是一个带有多个转储调用的工作版本:

代码语言:javascript
复制
import pickle

class Foo(object):
    pass

foo = Foo()
bar = Foo()
bar.foo_ref = foo

f = open('tmp.pkl', 'wb')
p = pickle.Pickler(f)
p.dump(foo)
p.dump(bar)
f.close()

f = open('tmp.pkl', 'rb')
up = pickle.Unpickler(f)
foo2 = up.load()
bar2 = up.load()

print id(foo) == id(bar.foo_ref) # True
print id(foo2) == id(bar2.foo_ref) # True
票数 7
EN

Stack Overflow用户

发布于 2011-06-17 01:42:10

如果将它们组合在一起,则pickle模块会跟踪引用,并且只会对foo变量进行一次pickle。你能像这样把foobar放在一起吗?

代码语言:javascript
复制
import pickle

class Foo(object):
    pass

foo = Foo()
bar = Foo()
bar.foo_ref = foo

with open('tmp.pkl', 'wb') as f:
    pickle.dump((foo, bar), f)
with open('tmp.pkl', 'rb') as f:
    foo2, bar2 = pickle.load(f)

print id(foo) == id(bar.foo_ref) # True
print id(foo2) == id(bar2.foo_ref) # True
票数 1
EN

Stack Overflow用户

发布于 2011-06-17 01:40:44

那么,你能做到:

代码语言:javascript
复制
bar2 = pickle.load(f)
foo2 = bar2.foo_ref

让pickle为你处理链接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6376081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档