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 - [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor