'Deepcopy helper for the data dictionary or list.
Regular expressions cannot be deep copied but as they are immutable we
don\'t have to copy them when cloning.'

def _deepcopy(self, x, memo=None):

    if (not hasattr(x, 'items')):
        (y, is_list, iterator) = ([], True, enumerate(x))
    else:
        (y, is_list, iterator) = ({}, False, iteritems(x))
    if (memo is None):
        memo = {}
    val_id = id(x)
    if (val_id in memo):
        return memo.get(val_id)
    memo[val_id] = y
    for (key, value) in iterator:
        if (isinstance(value, (dict, list)) and (not isinstance(value, SON))):
            value = self._deepcopy(value, memo)
        elif (not isinstance(value, RE_TYPE)):
            value = copy.deepcopy(value, memo)
        if is_list:
            y.append(value)
        else:
            if (not isinstance(key, RE_TYPE)):
                key = copy.deepcopy(key, memo)
            y[key] = value
    return y
