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 -- http://mail.python.org/mailman/listinfo/python-list