'Return a deep copy of this index.
Notes
The default deep copy must be overridden to perform
a shallow copy of the index columns, avoiding infinite recursion.
Parameters
memo : dict'

def __deepcopy__(self, memo):

    num_cols = (self.data.num_cols if (self.engine == SortedArray) else None)
    index = super(Index, Index).__new__(Index)
    index.__init__(None, engine=self.engine)
    index.data = deepcopy(self.data, memo)
    index.columns = self.columns[:]
    memo[id(self)] = index
    return index
