How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

Patricia Arquette
Release: 2024-10-19 17:28:01
Original
781 people have browsed it

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

Scope of Lambda Functions and Their Parameters

Lambda functions are anonymous functions that can capture the scope of their enclosing function. This allows them to access variables and parameters from the parent scope. However, this behavior can sometimes lead to unexpected results when lambda functions use parameters that are modified within the enclosing function.

To illustrate the issue, consider the following code:

<code class="python">def callback(msg):
    print(msg)

# Creating a list of function handles with an iterator
funcList = []
for m in ('do', 're', 'mi'):
    funcList.append(lambda: callback(m))

# Calling the lambda functions
for f in funcList:
    f()</code>
Copy after login

The expected output of this code is:

do
re
mi
Copy after login
Copy after login

However, the actual output is:

mi
mi
mi
Copy after login

This is because the lambda functions capture a reference to the variable m from the enclosing scope. When the iterator executes the loop, it assigns the value 'mi' to m in the final iteration. As a result, all the lambda functions have a reference to 'mi' when they are executed, even though different values were passed to them during creation.

To resolve this issue, you can capture the value of m at the time of lambda function creation by using it as the default value of an optional parameter:

<code class="python">for m in ('do', 're', 'mi'):
    funcList.append(lambda m=m: callback(m))</code>
Copy after login

This ensures that each lambda function has access to its own copy of m, capturing the value that was assigned during the loop iteration. The output of this code will be:

do
re
mi
Copy after login
Copy after login

The above is the detailed content of How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions. For more information, please follow other related articles on the PHP Chinese website!

source:php
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template