exec "statement" VS. exec "statement" in globals(), locals()

James Henderson james at logicalprogression.net
Wed Jul 21 16:02:01 EDT 2004


tedsuzman wrote:
> -----
> def f():
> 	ret = 2
> 	exec "ret += 10"
> 	return ret
> 
> print f()
> -----
> 
> The above prints '12', as expected. However,
> 
> ------
> def f():
> 	ret = 2
> 	exec "ret += 10" in globals(), locals()
> 	return ret
> 
> print f()
> ------
> 
> prints '2'. According to http://docs.python.org/ref/exec.html, "In all
> cases, if the optional parts are omitted, the code is executed in the
> current scope." Don't globals() and locals() consist of the current
> scope? Why aren't the two examples above equivalent?

Hi,

I believe that in the second you are changing the value of "ret" inside 
the dictionary returned by locals(), which does not actually change the 
value of the local variable "ret".  Viz.:

 >>> def f():
...   ret = 2
...   l = locals()
...   exec "ret += 10" in globals(), l
...   print l
...   return ret
...
 >>> f()
{'ret': 12}
2


See the entry on locals() in 
http://docs.python.org/lib/built-in-funcs.html :

Update and return a dictionary representing the current local symbol 
table. Warning: The contents of this dictionary should not be modified; 
changes may not affect the values of local variables used by the 
interpreter.

HTH,
James





More information about the Python-list mailing list