Generating a List of Lambda
def cm(): return [lambda x:i*x for i in range(3)] for m in cm(): print(m(1),end='')
Above is Python 3 sample. Which won't work since the lambdas are bound with
i . But
i is in rotation. So the Lambdas are created with binding to a var, when the Lambdas are evaluated, the var keeps the last value as "2" in current example. This is common Late Binding behavior as usual functions.
Solution 1: Use iterator rather than list
def cm(): return (lambda x:i*x for i in range(3)) for m in cm(): print(m(1))
Solution 2: Creating a Closure to Evaluate Arguments Immediately
Another way to mitigate the Late Binding is to create a Closure to immediately evaluate the parameters with a temporary variable.
def clip(): return [lambda x, i=i: i*x for i in range(3)]
However, the closure hacking is still a debating way to take more assumptions on language or interpreter implementation.