views:

293

answers:

2

Why does creating/modifying a member of locals() not work within a function?

Python 2.5 (release25-maint, Jul 20 2008, 20:47:25)
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> # Here's an example of what I expect to be possible in a function:
>>> a = 1
>>> locals()["a"] = 2
>>> print a
2

>>> # ...and here's what actually happens:
>>> def foo():
...  b = 3
...  locals()["b"] = 4
...  print b
...
>>> foo()
3
+6  A: 

Why would it? It's designed to return a representation, and was never intended for editing the locals. It's not ever guaranteed to work as a tool for such, as the documentation warns.

Devin Jeanpierre
Ah, I missed that because I only read the online help(). Thanks.
RobM
@Devin, because that would be the least surprising behavior, esp since you can modify globals in a similar way.
allyourcode
This is a fair complaint. For what it's worth, it works this way because Python speeds up local access in a way that makes this impossible, whereas the global namespace makes no such optimization (though that has been suggested, e.g. PEP 266). It is arguably a leaky abstraction that should go away. My personal preference would be to make globals() work the way locals() does now, rather than make locals() work like globals() does now. Regardless, my answer was more of a sneaky reference to the docs than a reference to intuition. It wouldn't do it because the docs don't say it should.
Devin Jeanpierre
+3  A: 

locals() return a copy of the namespace (which is the opposite of what globals() does). This means that any change you perform on the dictionary returned by locals() will have no effect. Check in dive into python at example 4.12.

Stefano Borini
Those aren't the docs, that's Dive into Python.
Devin Jeanpierre
whoops. you are right :)
Stefano Borini