title: Pygame: Save a list of objects/classes/surfaces
body: <p>I am working on a game, in which you can create mazes. You place blocks on a 16x16 grid, while choosing from a variety of block to make the level with. Whenever you create a block, it adds this class:</p>
  
  <pre><code>class Block(object):
      def __init__(self,x,y,spr):
          self.x=x
          self.y=y
          self.sprite=spr
          self.rect=self.sprite.get_rect(x=self.x,y=self.y)
  </code></pre>
  
  <p>to a list called <code>instances</code>.</p>
  
  <p>I tried shelving it to a .bin file, but it returns some error dealing with surfaces. How can I go about saving and loading levels?</p>
  
  <p>Any help is appreciated! :)</p>
  
  <p>Here is the whole code for reference:</p>
  
  <pre><code>import pygame
  from pygame.locals import *
  
  #initstuff
  pygame.init()
  screen=pygame.display.set_mode((640,480))
  pygame.display.set_caption('PiMaze')
  instances=[]
  
  #loadsprites
  menuspr=pygame.image.load('images/menu.png').convert()
  b1spr=pygame.image.load('images/b1.png').convert()
  b2spr=pygame.image.load('images/b2.png').convert()
  currentbspr=b1spr
  curspr=pygame.image.load('images/curs.png').convert()
  curspr.set_colorkey((0,255,0))
  
  #menu
  menuspr.set_alpha(185)
  menurect=menuspr.get_rect(x=-260,y=4)
  
  class MenuItem(object):
      def __init__(self,pos,spr):
          self.x=pos[0]
          self.y=pos[1]
          self.sprite=spr
          self.pos=(self.x,self.y)
          self.rect=self.sprite.get_rect(x=self.x,y=self.y)
  
  class Block(object):
      def __init__(self,x,y,spr):
          self.x=x
          self.y=y
          self.sprite=spr
          self.rect=self.sprite.get_rect(x=self.x,y=self.y)
  
  while True:
      #menu items
      b1menu=b1spr.get_rect(x=menurect.left+32,y=48)
      b2menu=b2spr.get_rect(x=menurect.left+64,y=48)
      menuitems=[MenuItem(b1menu,b1spr),MenuItem(b2menu,b2spr)]
  
      screen.fill((20,30,85))
      mse=pygame.mouse.get_pos()
      key=pygame.key.get_pressed()
      placepos=((mse[0]/16)*16,(mse[1]/16)*16)
      if key[K_q]:
          if mse[0]&lt;260:
              if menurect.right&lt;255:
                  menurect.right+=1
          else:
              if menurect.left&gt;-260:
                  menurect.left-=1
      else:
          if menurect.left&gt;-260:
              menurect.left-=1
      for e in pygame.event.get():
          if e.type==QUIT:
              exit()
  
          if menurect.right&lt;100:
              if e.type==MOUSEBUTTONUP:
                  if e.button==1:
                      to_remove = [i for i in instances if i.rect.collidepoint(placepos)]
                      for i in to_remove:
                          instances.remove(i)
                      if not to_remove:
                          instances.append(Block(placepos[0],placepos[1],currentbspr))
  
      for i in instances:
          screen.blit(i.sprite,i.rect)
      if not key[K_q]:
          screen.blit(curspr,placepos)
  
      screen.blit(menuspr,menurect)
  
      for item in menuitems:
          screen.blit(item.sprite,item.pos)
          if item.rect.collidepoint(mse):
              if pygame.mouse.get_pressed()==(1,0,0):
                  currentbspr=item.sprite
              pygame.draw.rect(screen, ((255,0,0)), item, 1)
      pygame.display.flip()
  </code></pre>