Understanding Python Lambda Binding with Local Values
When working with lambda functions in Python, it's important to understand how they interact with local variables, especially when multiple lambdas reference the same variable.
Consider the following example:
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda: pv(v)) # Lambda binds to the reference of 'v' for xx in x: xx() # Prints 1 twice</code>
Initially, you might expect the lambda functions in the list 'x' to reference the current 'v' at the time of their creation. However, this is not how Python works. Instead, Python evaluates the variable name at the time of the function call, leading to both lambdas referencing the final value of 'v' (which is 1).
To achieve the desired behavior (printing 0 and then 1), you can utilize Python's default argument mechanism:
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda v=v: pv(v)) # Lambda binds to the copy of 'v' at creation time for xx in x: xx() # Prints 0 and then 1</code>
By setting a default argument for 'v', the lambda functions are bound to a local copy of 'v' created at the time of their creation, ensuring they retain the correct references when used later.
Remember, Python looks up variable names at function call time, not creation time. This principle applies not only to lambdas but also to regular functions, as demonstrated by the following example:
<code class="python">x = "before foo defined" def foo(): print(x) # Prints "after foo was defined" x = "after foo was defined" foo()</code>
The above is the detailed content of How do Python Lambda Functions Handle Local Variable References and When Do They Get Evaluated?. For more information, please follow other related articles on the PHP Chinese website!