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).

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(self)