lambda

Alexis Roda arv.nntp at gmail.com
Fri Apr 21 17:49:18 EDT 2006


Ben C escribió:
> On 2006-04-21, Ben C <spamspam at spam.eggs> wrote:
> Having said that, I attempted to confirm this using def rather than
> lambda, and encountered something I cannot explain at all-- it appears
> that the functions are getting redefined whenever they are called, to
> effect a kind of "dynamic scoping" behaviour. I would appreciate any
> explanation anyone can give of this:
> 
> fns = []
> for y in range(2):
> 	def fn():
> 		yy = y      # exactly the same with yy = int(y)
> 		print "defining fn that returns", yy
> 		return yy
> 	print "Appending at", y
> 	print fn, fn()
> 	fns.append(fn)


yy = y does assign y's current value (current == fn call time, not fn 
definition time). To return 0 and 1 as expected you should create a 
"different/private" y for every fn's definition.

----------------------------------------

fns = []
for y in range(2):
	def fn(y=y):
		yy = y
		print "defining fn that returns", yy
		return yy
	print "Appending at", y
	print fn, fn()
	fns.append(fn)


----------------------------------------

fns = []
def factory(y) :
	def fn() :
		yy = y
		print "defining fn that returns", yy
		return yy
	return fn

for y in range(2) :
	fn = factory(y)
	print "Appending at", y
	print fn, fn()
	fns.append(fn)

----------------------------------------


HTH



More information about the Python-list mailing list