In Python 2.*
, you can disable the normal optimizations performed by the Python compiler regarding local variable access by starting your function with exec ''
; this will make the function very much slower (I just posted, earlier today, an answer showing how the local-variable optimization can easily speed code up by 3 or 4 times), but it will make your desired hack work. I.e., in Python 2.*:
def A():
exec ''
B(locals())
print x
def B(d):
d['x'] = 1
A()
will emit 1
, as you desire.
This hack was disabled in Python 3.*
(where exec
is just a function, not a statement nor a keyword any more) -- the compiler now performs the local variable optimization unconditionally, so there is no longer any way to work around it and make such hacks work.