Start here. This is the direct spoken answer to practice first.
Overview
Copy behavior matters most when a structure contains nested mutable values or identities that should not be duplicated.
Assignment creates another reference; it does not copy the object. A shallow copy creates a new outer container but keeps references to the same nested objects. A deep copy recursively copies reachable contents, using memoization to preserve repeated references and handle many cycles. If I shallow-copy a list of mutable dictionaries, replacing an outer list item is independent, but changing a shared dictionary is visible through both lists.