Late Binding in Closures
PY · Common Mistakessyntax
# BAD: variable captured by reference
# GOOD: use default argument to capture valueexample
# WRONG: All lambdas see final value of i
funcs_bad = [lambda: i for i in range(4)]
print([f() for f in funcs_bad])
# CORRECT: Capture current value via default arg
funcs_good = [lambda i=i: i for i in range(4)]
print([f() for f in funcs_good])output
[3, 3, 3, 3]
[0, 1, 2, 3]Note Python closures capture variables by reference, not by value. The loop variable's final value is what all closures see. The i=i default-argument trick forces a copy at each iteration.