laurt
laurt

Reputation: 1881

Python lambda expression

Consider the following:

>>> a=2
>>> f=lambda x: x**a
>>> f(3)
9
>>> a=4
>>> f(3)
81

I would like for f not to change when a is changed. What is the nicest way to do this?

Upvotes: 9

Views: 1564

Answers (2)

georg
georg

Reputation: 214959

Another option is to create a closure:

>>> a=2
>>> f = (lambda a: lambda x: x**a)(a)
>>> f(3)
9
>>> a=4
>>> f(3)
9

This is especially useful when you have more than one argument:

 f = (lambda a, b, c: lambda x: a + b * c - x)(a, b, c)

or even

 f = (lambda a, b, c, **rest: lambda x: a + b * c - x)(**locals())

Upvotes: 6

Martijn Pieters
Martijn Pieters

Reputation: 1121764

You need to bind a to a keyword argument when defining the lambda:

f = lambda x, a=a: x**a

Now a is a local (bound as an argument) instead of a global name.

Demo:

>>> a = 2
>>> f = lambda x, a=a: x**a
>>> f(3)
9
>>> a = 4
>>> f(3)
9

Upvotes: 13

Related Questions