Objetos enlazados

Quiero decapar un objeto y un segundo objeto que hace referencia al primero. Cuando decapito / despojo ingenuamente los dos objetos, la referencia se convierte en una copia. ¿Cómo puedo conservar el enlace entre los dos objetos foo y bar.foo_ref ?

 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) 

Mi respuesta anterior estaba perdiendo su punto. El problema con su código es que no está utilizando los objetos Pickler y Unpickler . Aquí hay una versión de trabajo con múltiples llamadas de volcado:

 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 

Si los pica juntos, el módulo pickle mantiene un registro de las referencias y solo escurre la variable foo una vez. ¿Puedes encurtir tanto a foo como a bar , así?

 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 

Bueno, ¿puedes hacer?

 bar2 = pickle.load(f) foo2 = bar2.foo_ref 

Deja que Pickle se encargue del enlace por ti.