2011-09-15 11 views
7

Jeśli mam obiekty a i b i oba obiekty odniesienia obj, co się stanie, gdy zbieram, a następnie odtwarzam obiekty? Czy marynowane dane "będą wiedzieć", że oba odnoszą się do tego samego obiektu i odpowiednio je przywracają, czy też dwa z nich uzyskają dwa różne obiekty — i początkowo równe —?Canlele obsługują wiele odwołań do obiektów

Odpowiedz

7

Tak, obiekty udostępnione zostaną tylko raz zserializowane (protokół pikla może nawet obsługiwać odwołania kołowe).

Z documentation:

Moduł pickle śledzi obiekty to już odcinkach, tak że późniejsze odwołania do tego samego obiektu nie będzie odcinkach ponownie. marshal nie robi tego.

Ma to wpływ zarówno na obiekty rekurencyjne, jak i na udostępnianie obiektów. Obiekty rekurencyjne są obiektami, które zawierają odniesienia do samych siebie. Nie są one obsługiwane przez marshal, a w rzeczywistości próba utworzenia kolumny obiektów rekursywnych spowoduje awarię interpretera języka Python. Udostępnianie obiektów dzieje się, gdy istnieje wiele odniesień do tego samego obiektu w różnych miejscach hierarchii obiektów. pickle przechowuje takie obiekty tylko raz i zapewnia, że ​​wszystkie inne odniesienia wskazują na kopię główną. Obiekty współużytkowane pozostają udostępnione, co może być bardzo ważne dla obiektów zmiennych.

+0

To jest fajne. :RE –

7

Jak zaznacza @aix, pickle rozumie wiele odniesień do tego samego obiektu, ale tylko w ramach pojedynczego piklowania. Oznacza to, że pikle zawsze ogrywają pojedynczy przedmiot. Jeśli ten obiekt zawiera odniesienia wewnątrz niego, odniesienia te zostaną poprawnie udostępnione w niezadrukowanym obiekcie.

Ale jeśli dwa razy wywołasz pikle, aby uzyskać dwa obiekty, współdzielone odniesienia między obiektami nie będą poprawnie zachowywane. Obiekt będzie teraz istnieć dwa razy.

Powiązane problemy