
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.