code: def copy(self):
          
          attrs = {k: self.__dict__[k].copy() for k in self.containers}
          attrs.update({k: cp.deepcopy(self.__dict__[k]) for k in self.shared})
          return self.__class__(**attrs)
docs: Returns a copy of the object.