Start here. This is the direct spoken answer to practice first.
Overview
Closures are useful for factories and decorators, but they capture bindings rather than frozen snapshots of every value.
A closure is a function that uses names from an enclosing function scope after that enclosing call has returned. Python resolves those captured names when the inner function runs, so the closure keeps access to the binding rather than automatically copying its value at creation. That late binding explains why callbacks created in a loop can all observe the loop variable's final value.