This question evaluates understanding of Python mutability and copying semantics — including how mutable versus immutable objects affect function arguments and container behavior — and knowledge of the Global Interpreter Lock (GIL) and concurrency models.

In Python, explain the differences between mutable and immutable objects and illustrate how they affect function arguments and container behavior. Describe how shallow copy differs from deep copy, when each is appropriate, and any pitfalls with nested structures. Explain the Global Interpreter Lock (GIL), its impact on multi-threading versus multi-processing for CPU-bound and I/O-bound tasks, and when to choose threads, processes, or async I/O.