Dave Angel <da...@ieee.org> dixit: > Maybe a more complex example might show the various linkages. > > glob = 42 > > def outer(parm1): > free = 12 > free3 = 19 > def inner(parm2, parm3=free3): > print "global", glob, ", free vars", parm1, free, free3, ", > locals", parm2, parm3 > free = 49 > free3 = 48 > return inner > > newfunc = outer(10) > newfunc(45) > > > produces output: > global 42 , free vars 10 49 48 , locals 45 19 > > So when the inner() function is actually called, glob is just a global. > parm1, fre, and free3 hold the values they ended up with when outer() > returned, and local parm2 is passed by top-level code, while local parm3 > gets its default value assigned when "def inner(...) was executed. > > Notice that the free variables free, free3, and parm1 are referring to > the function's ending state, not to the state when the function was > defined. This has an impact when you've got inner being defined in a > loop. And this example could be made more complex if outer() is a > generator, in which case it may not have actually ended when inner gets > called. > > HTH > DaveA
Great example, thank you. By the way, do you know the idiom: def makeInc(start): def inc(): inc.n += 1 print inc.n inc.n = start # 'start' may change now # ... return inc inc= makeInc(start=3) inc() I find it much nicer than a pseudo default value, for it explicitely shows that 'n' is, conceptually speaking, an attribute of the func (read: a closure upvalue). Let's take advantage of the fact python funcs are real objects! Denis ________________________________ la vita e estrany http://spir.wikidot.com/ _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor