If you just look at the set of points at each instant in time, the self-intersections would produce discontinuities. So instead of deforming a raw set of points in 3D space, topologists deform a function which takes a point on the sphere and returns a point in 3D space: https://en.wikipedia.org/wiki/Homotopy
Mechanically, you get this deformation by adding another parameter to the function between spaces. In Go-ish pseudo-code, say at each instant of time you have a function
// lon ranges from -180 to 180
// lat ranges from -90 to 90
func eversion_t(lon float, lat float) (x float, y float, z float) {
// return the xyz point corresponding to the lon/lat
}
which maps lon/lat points on the sphere to 3D space. Then the homotopy is a single function, parameterized by a t parameter // t ranges from 0 to 1 inclusive
// lon ranges from -180 to 180
// lat ranges from -90 to 90
func eversion(t float, lon float, lat float) (x float, y float, z float) {
// return the xyz point corresponding to the lat/lon at time t
// see https://arxiv.org/pdf/1711.10466.pdf for the implementation of this function
}
where this combined function is required to be continuous.By the way, the "push the ends of the sphere through each other" function is a perfectly valid homotopy. There's no topological way to talk about "creasing" -- you need derivatives for that. In particular, the eversion function is required to be an immersion (https://en.wikipedia.org/wiki/Immersion_(mathematics)) at each point in time, which is an additional constraint beyond just being a homotopy.