Capturing Variables in Anonymous Functions
Problem
You’ve defined an anonymous function using lambda but you also need
to capture the values of certain variables at the time of definition.
Solution
Consider the behavior of the following code:
>>>x=10>>>a=lambday:x+y>>>x=20>>>b=lambday:x+y>>>
Now ask yourself a question. What are the values of a(10) and
b(10)? If you think the results might be 20 and 30, you would be
wrong:
>>>a(10)30>>>b(10)30>>>
The problem here is that the value of x used in the lambda
expression is a free variable that gets bound at runtime, not
definition time. Thus, the value of x in the lambda expressions is
whatever the value of the x variable happens to be at the time of
execution. For example:
>>>x=15>>>a(10)25>>>x=3>>>a(10)13>>>
If you want an anonymous function to capture a value at the point of definition and keep it, include the value as a default value, like this:
>>>x=10>>>a=lambday,x=x:x+y>>>x=20>>>b=lambday,x=x:x+y>>>a(10)20>>>b(10)30>>>
Discussion
The problem addressed in this Shortcut is something that tends to come up in code that tries to be just a little bit too clever with the use of lambda functions—for example, creating a list of lambda expressions using a list comprehension or in a loop ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access