Hello, Below startup definitions:
x = 1 def f(): n = 1 def g0(a): print (x + n + a) return g0 I'm surprised the snippet below works as expected (py 2.6) without any trick: g = f() g(1) # --> 3 This means a (real) closure is built for g0, or what? Thought I would need instead to use the old trick of pseudo default-parameters: def f(): n = 1 def g0(a, n=n, x=x): print (x + n + a) return g0 to let the inner func g0 "remember" outer values. Why is this idiom used, then? Has something changed, or do I miss a relevant point? The bit below also works: x = 2 ... g(1) # --> 4 which seems to indicate python really embeds "symbolic references" (*) to outer *variables*, when creating a closure for g0. Not "pointer references" (**), otherwise the replacement of x would not be seen by the closure --like in the case of default-parameter. Actually, I find this _Bad_. Obviously, the func's behaviour and result depend on arbitrary external values (referentially opaque). What do you think? Denis (*) by name, indirect access, second table lookup (**) by address, direct access, no second lookup ________________________________ 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