lambda forms within a loop

Michal Ostrowski mostrows at gmail.com
Sun Oct 25 04:33:15 CET 2009


The snippet of code below uses two functions to dynamically create
functions using lambda.
Both of these uses should produce the same result, but they don't.

The expected output of this code is

11
12
11
12

However, what we get instead is

12
12
11
12

The problem is that the two functions returned by MakeLambdaBad() are
apparently the same, but the functions returned by MakeLambdaGood()
are different.

Can anyone explain why this would/should be the case?

--
Michal Ostrowski
mostrows at gmail.com


def MakeLambdaGood():
  def DoLambda(x):
     return lambda q: x + q
  a = []
  for x in [1,2]:
     a.append(DoLambda(x))
  return a

def MakeLambdaBad():
  a = []
  for x in [1,2]:
     a.append(lambda q:  x + q)
  return a

[a,b] = MakeLambdaBad()
print a(10)
print b(10)
[a,b] = MakeLambdaGood()
print a(10)
print b(10)



More information about the Python-list mailing list