添加`exec'将“`传递给函数允许修改locals()以反映在命名空间中?

时间:2011-11-01 22:25:57

标签: python namespaces

阅读问题的答案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认为它激发了这个功能吗?

1 个答案:

答案 0 :(得分:3)

This answer对另一个问题有一个很好的解释。以下是摘要:

  

exec语句的存在导致Python 2以完全非优化的方式编译f,因此本机在dict中而不是像往常一样在数组中。 (性能影响可能相当大)。