Phase 2 of 25 · Topic 2.3

Shallow Copy vs Deep Copy (copy module)

1Concept

1. Reference Assignment (`b = a`) aliases the identical memory object; 2. Shallow Copy (`copy.copy(a)`) duplicates the outer container but shares references to nested elements; 3. Deep Copy (`copy.deepcopy(a)`) recursively clones all nested objects and tracks visited IDs to avoid infinite loops on circular graphs.

2Architecture Diagram

Original:   [ Ref A, [Nested List] ]
Shallow:    [ Ref B, [Points to SAME Nested List!] ]
Deep Copy:  [ Ref C, [Brand New Cloned Nested List] ]

3Code Example

Python 3.12
import copy

original = [1, [2, 3]]
shallow = copy.copy(original)
deep = copy.deepcopy(original)

original[1].append(99) # Mutating inner list

print(f"Original: {original}")
print(f"Shallow:  {shallow}  (Inner mutated!)")
print(f"Deep:     {deep}  (Completely protected!)")

4Expected Output

Original: [1, [2, 3, 99]]
Shallow:  [1, [2, 3, 99]]  (Inner mutated!)
Deep:     [1, [2, 3]]  (Completely protected!)

5Key Takeaways

  • Modifying nested elements inside a shallow copy corrupts the original data.
  • `copy.deepcopy()` maintains a memo dictionary to prevent infinite recursion on circular objects.
  • Custom classes can override `__copy__()` and `__deepcopy__()` for fine-grained control.