Assignment binds names to objects—it does not copy. Shallow copies duplicate the container but share nested objects; deep copies recurse—critical when mutating nested lists or dicts.
Aliasing vs copy
a = [1, 2, [3]]
b = a # alias
c = a.copy() # shallow
import copy
d = copy.deepcopy(a)
Nested mutation pitfall
a = [[1], [2]]
b = a.copy()
b[0].append(99)
print(a) # [[1, 99], [2]] — inner lists shared
Contrast with value semantics for small structs in C#—Python always passes object references.
Important interview questions and answers
- Q: Shallow vs deep copy?
A: Shallow copies top-level container; deep copy clones nested mutable objects recursively. - Q: Default argument list pitfall?
A: Shared mutable default persists across calls—useNonesentinel.
Self-check
- Does
b = acopy a list? - When do you need
copy.deepcopy?
Pitfall: .copy() is shallow—nested lists still alias until copy.deepcopy.
Interview prep
- Shallow vs deep?
Shallow copies container; nested objects shared—deepcopy clones the full tree.
- Assignment vs copy?
b = aaliases;b = a.copy()new outer list with shared innards if nested.