exec() an locals() puzzle
george trojan
george.trojan at gmail.com
Wed Jul 20 12:56:02 EDT 2022
I wish I could understand the following behaviour:
1. This works as I expect it to work:
def f():
i = 1
print(locals())
exec('y = i; print(y); print(locals())')
print(locals())
exec('y *= 2')
print('ok:', eval('y'))
f()
{'i': 1}
1
{'i': 1, 'y': 1}
{'i': 1, 'y': 1}
ok: 2
2. I can access the value of y with eval() too:
def f():
i = 1
print(locals())
exec('y = i; print(y); print(locals())')
print(locals())
u = eval('y')
print(u)
f()
{'i': 1}
1
{'i': 1, 'y': 1}
{'i': 1, 'y': 1}
1
3. When I change variable name u -> y, somehow locals() in the body of
the function loses an entry:
def f():
i = 1
print(locals())
exec('y = i; print(y); print(locals())')
print(locals())
y = eval('y')
print(y)
f()
{'i': 1}
1
{'i': 1, 'y': 1}
{'i': 1}
---------------------------------------------------------------------------NameError
Traceback (most recent call last)
Input In [1], in <cell line: 10>() 7 print(y) 8 # y
= eval('y') 9 #print('ok:', eval('y'))---> 10 f()
Input In [1], in f() 4 exec('y = i; print(y); print(locals())')
5 print(locals())----> 6 y = eval('y') 7 print(y)
File <string>:1, in <module>
NameError: name 'y' is not defined1.
Another thing: within the first exec(), the print order seems
reversed. What is going on?
BTW, I am using python 3.8.13.
George
More information about the Python-list
mailing list