阅读问题的答案What's the difference between globals(), locals(), and vars()?,以下解释了locals()
的工作原理:
如果在函数内部调用了locals(),它会在该时刻构造函数名称空间的字典并返回它 - 任何进一步的名称赋值都不会反映在返回的字典中,并且不会反映对字典的任何赋值在实际的本地命名空间
在评论中,提到了
部分“和字典的任何赋值都没有反映在实际的本地命名空间中”可能措辞有点明确。
链接到以下代码:
def f():
exec "pass"
locals()["x"] = 42
print(x)
f()
返回42
(至少在CPython 2.7中)。没有行exec "pass"
python会抛出NameError
,因为它找不到'x'
。这符合定义,即函数内locals()
返回的字典更改不会反映在命名空间中。为什么添加行exec "pass"
可以反映这些更改?这在某种程度上欺骗python认为它激发了这个功能吗?
答案 0 :(得分:3)
This answer对另一个问题有一个很好的解释。以下是摘要:
exec语句的存在导致Python 2以完全非优化的方式编译f,因此本机在dict中而不是像往常一样在数组中。 (性能影响可能相当大)。