Where do nested functions live?
anthra.norell at vtxmail.ch
Sat Oct 28 18:20:43 CEST 2006
Fredrik Lundh wrote:
> Steven D'Aprano wrote:
>> I defined a nested function:
>> def foo():
>> def bar():
>> return "bar"
>> return "foo " + bar()
>> which works. Knowing how Python loves namespaces, I thought I could do
>> Traceback (most recent call last):
>> File "<stdin>", line 1, in ?
>> AttributeError: 'function' object has no attribute 'bar'
>> but it doesn't work as I expected.
>> where do nested functions live?
> in the local variable of an executing function, just like the variable
> "bar" in the following function:
> def foo():
> bar = "who am I? where do I live?"
> (yes, an inner function is *created* every time you execute the outer
> function. but it's created from prefabricated parts, so that's not a
> very expensive process).
If I may turn the issue around, I could see a need for an inner function
to be able to access the variables of the outer function, the same way a
function can access globals. Why? Because inner functions serve to
de-multiply code segments one would otherwise need to repeat or to
provide a code segment with a name suggestive of its function. In either
case the code segment moved to the inner function loses contact with its
environment, which rather mitigates its benefit.
If I have an inner function that operates on quite a few outer
variables it would be both convenient and surely more efficient, if I
could start the inner function with a declaration analogous to a
declaration of globals, listing the outer variables which I wish to
remain writable directly.
I guess I could put the outer variables into a list as argument to
the inner function. But while this relieves the inner function of
returning lots of values it burdens the outer function with handling the
list which it wouldn't otherwise need.
More information about the Python-list