2011-09-15 11 views
7

オブジェクトがabで、両方が参照オブジェクトobjである場合、ピクルでオブジェクトを復元するとどうなりますか?ピンクのデータはabの両方が同じオブジェクトを参照し、それに応じてすべてを復元することを「知っていますか」、または2つの異なる—と最初は—というオブジェクトがありますか?Pickleは複数のオブジェクト参照を扱うことができます

答えて

7

はい、共有オブジェクトは1回だけシリアル化されます(ピクルプロトコルは循環参照を処理することさえできます)。 documentationから

pickleモジュールは、同じオブジェクトへの以降の参照は が再びシリアライズされないように、それは、すでに シリアライズさを持っているオブジェクトを追跡します。 marshalはこれを行いません。

これは、再帰オブジェクトとオブジェクト共有の両方に意味があります。 再帰オブジェクトは、自身への参照を含むオブジェクトです。 これらはmarshalで処理されません。実際には、再帰オブジェクト をマーシャリングしようとすると、Pythonインタプリタがクラッシュします。オブジェクト共有 は、オブジェクト階層の異なる場所がシリアル化されている の同じオブジェクトへの複数の参照がある場合に発生します。 pickle は、そのようなオブジェクトを1回だけ格納し、他のすべての参照 がマスターコピーを指していることを保証します。共有オブジェクトは共有されたままです。変更可能なオブジェクトの場合は非常に重要です( )。

+0

これはクールです。 :D –

7

@aixが指摘しているように、pickleは同じオブジェクトに対する複数の参照を理解していますが、単一の酸漬けでのみ理解できます。つまり、ピクルスは常に単一のオブジェクトをピクルスします。そのオブジェクトにそのオブジェクト内の参照がある場合、それらの参照は、unpickleオブジェクトで適切に共有されます。

しかし、pickleを2回呼び出して2つのオブジェクトをpickleすると、オブジェクト間の共有参照は適切に保存されません。オブジェクトは現在2回存在します。

関連する問題