modifying locals

M.-A. Lemburg mal at egenix.com
Fri Oct 31 11:17:37 CET 2008


On 2008-10-31 09:08, Tino Wildenhain wrote:
> Hi,
> 
> Steven D'Aprano wrote:
>> On Fri, 31 Oct 2008 07:10:05 +0100, Tino Wildenhain wrote:
>>
>>> Also, locals() already returns a dict, no need for the exec trickery.
>>> You can just modify it:
>>>
>>>  >>> locals()["foo"]="bar"
>>>  >>> foo
>>> 'bar'
>>>
>>
>> That is incorrect. People often try modifying locals() in the global
>> scope, and then get bitten when it doesn't work in a function or class.
> 
>>
>>>>> def foo():
>> ...     x = 1
>> ...     locals()['y'] = 2
>> ...     y
>> ...
>>>>> foo()
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>>   File "<stdin>", line 4, in foo
>> NameError: global name 'y' is not defined
>>
>> You cannot modify locals() and have it work. The fact that it happens
>> to work when locals() == globals() is probably an accident.
> 
> Ah thats interesting. I would not know because I usually avoid
> such ugly hacks :-)

It doesn't even work for already defined local variables:

>>> def foo():
...     x = 1
...     locals()['x'] = 2
...     print x
...
>>> foo()
1

The reason is that locals are copied in to a C array
when entering a function. Manipulations are then
done using the LOAD_FAST, STORE_FAST VM opcodes.

The locals() dictionary only shadows these locals: it copies
the current values from the C array into the frame's
f_locals dictionary and then returns the dictionary.

This also works the other way around, but only in very
cases:

 * when running "from xyz import *"
 * when running code using "exec"

globals() on the other hand usually refers to a module
namespace dictionary, for which there are no such
optimizations..

I don't know of any way to insert locals modified in
a calling stack frame... but then again: why would you
want to do this anyway ?

-- 
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Source  (#1, Oct 31 2008)
>>> Python/Zope Consulting and Support ...        http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ...             http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ...        http://python.egenix.com/
________________________________________________________________________

:::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,MacOSX for free ! ::::


   eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
    D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
           Registered at Amtsgericht Duesseldorf: HRB 46611



More information about the Python-list mailing list