Hello Eike! Eike Welk <eike.w...@gmx.net> dixit:
> Hello Spir! > > On Monday 30 November 2009, spir wrote: > > 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). > > If I understand you right, you are proposing that the inner function > g0 should get a separate copy of the global namespace. The copy should > be done when the function is defined. > > When this would be implemented, inner functions (g0) would be treated > very differently from outer functions (f), with respect to global > variables. I would not like this different treatment. When a global > variable is changed all functions should see the change. > > I think currently there are three 'containers' where functions can > find variables in Python: > - local variables > - the closure, which is empty in outer functions (f.func_closure) > - global variables, this is probably f.__module__.__dict__. > > The exact semantics of closures seem to be a bit tricky. Below is some > behavior I find surprising. I had expected that a local variable 'i' > is created in function 'inc'. Instead the function fails with an > error. (Producing the error is IMHO surprising, but sane behavior.): > > In [25]:def clos(): > i = 0 > def inc(): > i = i + 1 > print i > def pri(): > print i > return inc, pri > > In [33]:inc, pri = clos() > > In [34]:pri() > 0 > > In [35]:inc() > ------------------------------------------------------------------- > UnboundLocalError Traceback (most recent call last) > > /home/eike/<ipython console> in <module>() > /home/eike/<ipython console> in inc() > UnboundLocalError: local variable 'i' referenced before assignment Well, this is certainly not specific to closures. i = 0 def f(): i = i+1 print i f() ==> UnboundLocalError Imo, in this case, "i = i+1" is a kind of "paradoxal injonction" (lol! not sure of the exact idiom in english). You tell python both to create a local i (thus ignore any other scope to lookup for variables called 'i') and to use global i to define the local one. If I were the victim of such a "paradoxal injonction" I would reply with a naughty word! > --- > Eike. > 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