On Fri, Sep 11, 2015 at 9:44 AM, Chris Angelico <ros...@gmail.com> wrote: > On Sat, Sep 12, 2015 at 1:27 AM, Ian Kelly <ian.g.ke...@gmail.com> wrote: >> The exec still happily runs; it's just using its own private locals >> namespace. >> >> Tangent: does the help for exec need to be updated? It currently reads: >> >> The globals and locals are dictionaries, defaulting to the current >> globals and locals. If only globals is given, locals defaults to it. >> >> Which would seem to indicate that if called from within a function >> with no globals or locals, the locals from the function would be used. > > And that's the thing... I think. It's using locals(), which starts out > as a copy of the function's locals (in this example, empty), but > without assignment affecting anything. Which is more than a little > weird: > >>>> def f(): > ... x = [1] > ... exec("print(x); x[0] = 2; print(x); x = [3]; print(x)") > ... print(x) > ... >>>> f() > [1] > [2] > [3] > [2]
Ah, that makes sense. It's writing into the dict that is created and returned by locals(), but not actually updating the frame locals which are the source of truth. -- https://mail.python.org/mailman/listinfo/python-list