When creating functions or lambdas within a loop, it's important to consider the concept of late binding. In the given example:
functions = [] for i in range(3): def f(): return i functions.append(f)
each function looks up the value of i as late as possible, which is after the loop has finished. As a result, all functions return the final value of i, which is 2.
To fix this issue and get three distinct functions that output 0, 1, and 2, we need to force early binding. This can be achieved by using default parameters:
functions = [] for i in range(3): def f(i=i): # Default parameter for i return i functions.append(f)
In this case, the default parameter i is evaluated at definition time, not at call time, ensuring that each function uses the correct value of i.
Alternatively, we can use a function factory to create functions with early binding:
def make_f(i): def f(): return i return f functions = [] for i in range(3): functions.append(make_f(i))
The make_f function creates a new function with the correct value of i bound early.
The above is the detailed content of Why Do Functions Created in a Loop Return the Same Value, and How Can I Fix It?. For more information, please follow other related articles on the PHP Chinese website!