updating locals() and globals() (WAS: How do I do this? (eval() on the left hand side))
Jeff Shannon
jeff at ccvcorp.com
Wed Dec 8 18:53:18 EST 2004
Steven Bethard wrote:
> I remember hearing an explanation of why locals() is not writable that
> had to do with something about efficiency and the call stack (or
> something like that)...
IIRC, the function local namespace (in CPython) is kept internally as a
static array, rather than as a dictionary, which dramatically speeds
(function-local) name lookups. However, this also means that all local
names must be determinable at function-definition time. In contrast,
the global namespace is a true Python dictionary. Where globals()
returns a reference to that dictionary, locals() (when locals() is not
globals()) constructs a separate dictionary from the static array
containing the local namespace. In effect, globals() gives a reference
while locals() gives a copy, with standard Python reference/copy
semantics applying.
(Note also that functions which use exec cannot use the static namespace
optimization, and thus tend to be *much* slower than normal functions
(in addition to being a huge security problem). I don't know, however,
whether locals() can update the local namespace in such un-optimized
functions. Whether it actually does so or not, relying on such
special-case behavior would be extremely foolish to do...)
Of course, I'm just going off of what I remember having been said
elsewhere on c.l.p., and I wouldn't recommend anyone betting their life
savings on the reliability of my memory... :)
Jeff Shannon
Technician/Programmer
Credit International
More information about the Python-list
mailing list