Pickling classes -- disappearing lists?

Chris Rebert clp2 at rebertia.com
Mon Jul 13 17:50:23 EDT 2009


On Mon, Jul 13, 2009 at 2:14 PM, Aaron Scott<aaron.hildebrandt at gmail.com> wrote:
> I'm trying to pickle an instance of a class. It mostly works just fine
> -- I can save the pickle to a file, restore it from that file, and
> it's mostly okay. The problem is, some lists seem to disappear. For
> example (snipped and crunched from the code giving me trouble):
>
> ---
>
>
> class InitGame:
>        value = False
>        journal = []
>
>
> game.InitGame()

That line doesn't make sense with the code you've given...

> def Save():
>        global game
>        import cPickle, gzip, os
>
>        # Change some data
>        game.journal.append("A value")
>        game.value = True
>
>        pickles = {'game': game}
>        jar = gzip.open("pickefile", 'wb')
>        cPickle.dump(pickles, jar, 2)
>        jar.close()
>
>
> def Load():
>        global game
>        import gzip, os, cPickle
>        jar = gzip.open("picklefile", 'r')
>        loaded = cPickle.load(jar)
>        jar.close()
>        game = loaded["game"]
>
>
> ---
>
> Now, if I save a pickle, then load it back in, I'll get an instance of
> InitGame called "game", and game.value will be true, but the list
> "journal" will be empty.
>
> Am I missing something obvious about the pickle spec? Am I doing
> something wrong? Or should I be hunting for a deeper bug in the code?

Your class definition isn't right. It makes 'value' and 'journal'
class variables (Java lingo: "static variables") as opposed to the
instance variables they should be. Here's a corrected version:

class InitGame(object):
    def __init__(self):
        #instance variables are created through self.foo assignments in __init__
        self.value = False
        self.journal = []

Cheers,
Chris
--
http://blog.rebertia.com



More information about the Python-list mailing list