A lambda is just an anonymous function – a function defined with no name. In some languages, such as Scheme, they are equivalent to named functions. In fact, the function definition is re-written as binding a lambda to a variable internally. In other languages, like Python, there are some (rather needless) distinctions between them, but they behave the same way otherwise.
A closure is any function which closes over the environment in which it was defined. This means that it can access variables not in its parameter list. Examples:
def func(): return h def anotherfunc(h): return func()
This will cause an error, because
func does not close over the environment in
h is undefined.
func only closes over the global environment. This will work:
def anotherfunc(h): def func(): return h return func()
func is defined in
anotherfunc, and in python 2.3 and greater (or some number like this) when they almost got closures correct (mutation still doesn’t work), this means that it closes over
anotherfunc‘s environment and can access variables inside of it. In Python 3.1+, mutation works too when using the
Another important point –
func will continue to close over
anotherfunc‘s environment even when it’s no longer being evaluated in
anotherfunc. This code will also work:
def anotherfunc(h): def func(): return h return func print anotherfunc(10)()
This will print 10.
This, as you notice, has nothing to do with lambdas – they are two different (although related) concepts.