TPJ wrote: > I have the following code: > > ----------------------------------- > def f(): > > def g(): > a = 'a' # marked line 1 > exec 'a = "b"' in globals(), locals() > print "g: a =", a > > a = 'A' # marked line 2 > exec 'a = "B"' in globals(), locals() > print "f: a =", a > g() > > f() > ----------------------------------- > > I don't understand, why its output is: > > f: a = A > g: a = a > > instead of: > > f: a = B > g: a = b
Use the exec statement without the in-clause to get the desired effect: >>> def f(): ... a = "a" ... exec "a = 'B'" ... print a ... >>> f() B Inside a function locals() creates a new dictionary with name/value pairs of the variables in the local namespace every time you call it. When that dictionary is modified the local variables are *not* updated accordingly. >>> def f(): ... a = "a" ... d = locals() ... exec "a = 'B'" in globals(), d ... print a, d["a"] ... >>> f() a B By the way, experiments on the module level are likely to confuse because there locals() returns the same dictionary as globals(). Peter -- http://mail.python.org/mailman/listinfo/python-list