为什么exec()指定不工作?和x =?

时间:2014-01-28 15:23:39

标签: python namespaces exec python-internals

在python3.3中:

x = 1
print('global x =', x)
def f():
    exec('x=2')
    #x = 2
    print('local in f() x =', x)
    def g():
        print('local in g() x =', x)
    g()

f()

在python3.3中为什么结果是这样的:

    global x = 1
    local in f() x = 1
    local in g() x = 1

任何人都可以告诉我为什么exec('x = 2')不等于x = 2

'x = 2'和exec('x = 2')之间有什么区别?

1 个答案:

答案 0 :(得分:1)

函数中的本地高度优化并在编译时确定,存储在帧中的数组中。每个本地名称只是字节代码中的索引,索引到该数组中。

另一方面,

exec()尝试将本地处理为可写字典,但在函数内部,locals()返回的字典连接到实际的本地数组一个功能。您无法使用exec()设置本地人。

引用locals() function文档:

  

注意:不应修改此词典的内容;更改可能不会影响解释器使用的本地和自由变量的值。

来自exec() function

  

注意:默认 locals 的行为与下面的函数locals()相同:对默认 locals 字典的修改不应该是尝试。如果您需要在函数exec()返回后查看代码对 locals 的影响,请传递显式的 locals 字典。

在函数内添加行x = 2时,编译器会确定x是本地的。