Wired Python lambda scope (lambda closure)

think of this two code

powers = [lambda x: x**i for i in range(10)]
print(powers[3](2))
powers1 = []
for i in range(10):
	powers1.append(lambda x:x**i)
print(powers1[3](2))

What do you expect the result.

The result is 512 and 512. Not 8 and 8

The reason is lambda didn't evaluate i immediately.

Python’s closures are late binding. This means that the values of variables used in closures are looked up at the time the inner function is called.

ref: https://docs.python-guide.org/writing/gotchas/#late-binding-closures

the correct implementation should be

powers = [lambda x,j=i: x**j for i in range(10)]
print(powers[3](2))
powers1 = []
def a(i):
	def b(x):
		return x**i
	return b 
for i in range(10):
	powers1.append(a(i))
print(powers1[3](2))