code: def copy(self, extra=None):
          
          if extra is None:
              extra = dict()
          that = copy.copy(self)
          that._paramMap = {}
          that._defaultParamMap = {}
          return self._copyValues(that, extra)
docs: Creates a copy of this instance with the same uid and some
          extra params. The default implementation creates a
          shallow copy using :py:func:`copy.copy`, and then copies the
          embedded and extra parameters over and returns the copy.
          Subclasses should override this method if the default approach
          is not sufficient.
  
          :param extra: Extra parameters to copy to the new instance
          :return: Copy of this instance