[Tutor] python closures

spir denis.spir at free.fr
Mon Nov 30 11:24:45 CET 2009


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/



More information about the Tutor mailing list