Python eval不使用locals()调用from或locals()传递给eval用于func

时间:2017-04-03 21:26:11

标签: python eval

def one():
    var1 = 1

    def sub():
        nonlocal var1
        var1 += 1
        return var1

    return sub


def two():
    var1 = 5
    sub1 = one()
    return eval('sub1()', globals(), locals())


if __name__ == "__main__":
    print(two())

我期待上面的代码打印6但它打印2. Python 3.6.1 docs声明:“表达式参数使用全局变量和局部变量进行解析并作为Python表达式进行评估(技术上讲,条件列表)字典作为全局和本地命名空间。“

全局和本地命名空间是否仅适用于可在eval中解析的内容?函数调用sub1()在sub1()函数的命名空间中进行计算,而不管传递给eval的全局或局部是什么?

2 个答案:

答案 0 :(得分:1)

是的,全局和本地命名空间几乎只适用于那些可以在eval中解析的命名空间。函数对象静态绑定到它们的全局对象(模块!),当输入函数时,会创建一个新的本地名称空间。

答案 1 :(得分:1)

nonlocal是指函数定义的父作用域,而不是调用站点。当您将本地人传递到eval时,您不会更改您调用的函数内的局部变量 - 您需要为您正在评估的代码段设置局部变量。因此编写eval('sub1()', globals(), locals()等同于编写sub1(),因为相同的局部变量都在范围内 - 如果你写了那么你也不会期望sub1返回6,对吗? / p>