A deep copy duplicates the object or variable being pointed to so that the destination (the object being assigned to) receives it’s own local copy. This way, the destination can do whatever it wants to it’s local copy and the object that was copied from will not be affected.
Doing deep copies requires that we write our own copy constructors and overloaded assignment operators if we are working with C++ or Java.