Writing To Locals() Works In Contrast To Documentation Saying Its Not
Solution 1:
at module scope, locals() returns the global module dict which can be modified. locals in a function are different. Here, the variable is not changed. As mentioned elsewhere, this is all implementation dependent. You can't rely on locals() working as a writer.
>>>deffoo():...    x = 2...locals()['x'] = 3...print(x)...>>>>>>foo()
2
EDIT
In cpython, local variables are turned into slots on the frame object. By the time python runs the program, "x" is no longer "x", its an index into the slot.
>>> from dis import dis
>>> dis(foo)
  20 LOAD_CONST               1 (2)
              2 STORE_FAST               0 (x)
  34 LOAD_CONST               2 (3)
              6 LOAD_GLOBAL              0 (locals)
              8 CALL_FUNCTION            010 LOAD_CONST               3 ('x')
             12 STORE_SUBSCR
  414 LOAD_GLOBAL              1 (print)
             16 LOAD_FAST                0 (x)
             18 CALL_FUNCTION            120 POP_TOP
             22 LOAD_CONST               0 (None)
             24 RETURN_VALUE
STORE_FAST 0 means to store the current value (it happens to be 2) into slot 0.
Solution 2:
Where are you reading this? Both Py 2 docs and Py 3 docs have the following disclaimer:
Note: The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.
This shows exactly what this is: an implementation detail. Sure, it works in CPython, but it might not work in the various other interpreters, like IronPython and Jython. It's what would be called a hack.
Do not rely on it updating any variables. Do not even try to do it for anything serious, as it causes undefined behaviour.
In CPython 3.6.0, help(locals) has the following note:
NOTE: Whether or not updates to this dictionary will affect name lookups in
the local scope and vice-versa is *implementation dependent* and not
covered by any backwards compatibility guarantees.
CPython 2.7.13 has no such note, however.
Post a Comment for "Writing To Locals() Works In Contrast To Documentation Saying Its Not"