Home  >  Article  >  Backend Development  >  Why Does My Lambda Function Always Print \"5\"? A Guide to Capturing Variables in Python.

Why Does My Lambda Function Always Print \"5\"? A Guide to Capturing Variables in Python.

Susan Sarandon
Susan SarandonOriginal
2024-10-26 17:26:03369browse

Why Does My Lambda Function Always Print

Capturing Variables in Lambda Functions: Closure

In lambda functions, capturing variables from the enclosing scope is a common issue. A lambda function, by default, references variables in its enclosing scope. However, the resolution of these references occurs at the time of execution, not during definition.

Consider this code snippet, where we create five buttons using a loop and bind a command to each button to print its index using a lambda function:

<code class="python">for i in range(5):
    make_button = Tkinter.Button(frame, text ="make!",
                                 command= lambda: makeId(i))</code>

You might expect that this code will print the index of the button that was clicked. However, it always prints "5" because the value of i is captured at the time the loop finishes, which is after i has been incremented to 5.

Solution: Using a Closure

To resolve this issue, we can use a closure. A closure is a function that captures variables from its enclosing scope and initializes them when it is defined. This allows us to capture the correct value of i for each button.

<code class="python">make_button = Tkinter.Button(frame, text ="make!",
                              command= lambda i=i: makeId(i))</code>

By assigning i=i within the lambda function, we create a local variable that is initialized with the current value of i from the loop. This ensures that each button has its own reference to its intended index.

The above is the detailed content of Why Does My Lambda Function Always Print \"5\"? A Guide to Capturing Variables in Python.. For more information, please follow other related articles on the PHP Chinese website!

Statement:
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