code: def copy(self,*args,**kwargs):
          '''
          Returns a copy of the current data object
          
          :param flag: if an argument is provided, this returns an updated copy of current object (ie. equivalent to obj.copy();obj.update(flag)), optimising the memory (
          :keyword True deep: deep copies the object (object data will be copied as well).
          '''
          deep=kwargs.get('deep',True)
          
          if len(args) > 0:
              return self.updated_copy(*args)
          else :
              return copy.deepcopy(self) if deep else copy.copy(selff copy(self,*args,**kwargs):
          '''
          Returns a copy of the current data object
          
          :param flag: if an argument is provided, this returns an updated copy of current object (ie. equivalent to obj.copy();obj.update(flag)), optimising the memory (
          :keyword True deep: deep copies the object (object data will be copied as well).
          '''
          deep=kwargs.get('deep',True)
          
          if len(args) > 0:
              return self.updated_copy(*args)
          else :
              return copy.deepcopy(self) if deep else copy.copy(self)
docs: Returns a copy of the current data object
          
          :param flag: if an argument is provided, this returns an updated copy of current object (ie. equivalent to obj.copy();obj.update(flag)), optimising the memory (
          :keyword True deep: deep copies the object (object data will be copied as well).