Assignment binds names to the same object; mutable objects can be changed through any reference that points to them, which surprises newcomers.
python a = [1, 2, 3] b = a b.append(4) print(a) # [1, 2, 3, 4] -- same list! import copy c = a.copy() # shallow copy, new outer list d = copy.deepcopy(a) # recursively copies nested structures too
A shallow copy duplicates the top-level container but still shares references to nested mutable objects; `copy.deepcopy` recursively copies everything, which matters when lists contain other lists or dicts that must be fully independent.