Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Pickle problem

1 view
Skip to first unread message

Mario Ceresa

unread,
Apr 18, 2008, 11:55:16 AM4/18/08
to pytho...@python.org
Hello everybody:
I'd like to use the pickle module to save the state of an object so to
be able to restore it later. The problem is that it holds a list of
other objects, say numbers, and if I modify the list and restore the
object, the list itself is not reverted to the saved one, but stays
with one element deleted.
An example session is the following:

Data is A [1, 2, 3, 4]
saving a with pickle
Deleting an object: del a[3]
Now data is A [1, 2, 3]
Oops! That was an error: can you please recover to the last saved data?
A [1, 2, 3] #### I'd like to have here A[1,2,3,4]!!!!!!

Is it the intended behavior for pickle? if so, are there any way to
save the state of my object?

Code follows
-----------------------
class A(object):
objects = []
-----------------------
then I run the code:
---------------------------------------
import pickle
from core import A

a = A()

for i in [1,2,3,4]:
a.objects.append(i)

savedData = pickle.dumps(a)
print "Saved data is ",a
print "Deleting an object"
del a.objects[3]
print a
print "Oops! This was an error: can you please recover the last saved data?"

print pickle.loads(savedData)
--------------------------------------------

Thank you for any help!

Mario

Jerry Hill

unread,
Apr 18, 2008, 1:18:08 PM4/18/08
to Mario Ceresa, pytho...@python.org
On Fri, Apr 18, 2008 at 11:55 AM, Mario Ceresa <cer...@gmail.com> wrote:
> Hello everybody:
> I'd like to use the pickle module to save the state of an object so to
> be able to restore it later. The problem is that it holds a list of
> other objects, say numbers, and if I modify the list and restore the
> object, the list itself is not reverted to the saved one, but stays
> with one element deleted.
...

> -----------------------
> class A(object):
> objects = []
> -----------------------

Your problem is in the class definition of A. You declare objects as
a class variable, so it is shared between every instance of the class.
When you pickle the instance a, then restore it, it continues to
reference the same list, which is help by the class.

You probably want the objects list to be an instance variable, like this:

class A(object):
def __init__(self):
self.objects = []

If you make that change, pickling and unpickling works the way you expect.

--
Jerry

George Sakkis

unread,
Apr 18, 2008, 2:00:06 PM4/18/08
to

The problem is that the way you define 'objects', it is an attribute
of the A *class*, not the instance you create. Change the A class to:

class A(object):
def __init__(self):
self.objects = []

and rerun it; it should now work as you intended.

HTH,
George

Mario Ceresa

unread,
Apr 21, 2008, 4:05:30 AM4/21/08
to George Sakkis, Jerry Hill, pytho...@python.org
Dear Jerry and George:
it works like a charm! I always thought that the first way was a
quicker alternative to defining the init method... shame on me!

>From now on I'll read the list every day repeating to myself:
"Premature optimization is the root of all evil", "Premature
optimization is the root of all evil", .... :)

Thanks a lot,

Mario

> --
> http://mail.python.org/mailman/listinfo/python-list
>

0 new messages