首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python eval不会在调用时使用locals(),也不会将locals()传递给eval以获取函数

Python eval不会在调用时使用locals(),也不会将locals()传递给eval以获取函数
EN

Stack Overflow用户
提问于 2017-04-04 05:26:11
回答 2查看 230关注 0票数 0
代码语言:javascript
复制
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())

Python 3.6.1文档声明:“使用全局和局部字典作为全局和局部名称空间,将表达式参数作为Python表达式(从技术上讲,是条件列表)进行解析和计算。”

全局和本地名称空间是否仅适用于eval中可以解析的名称空间?调用sub1()的函数在sub1()函数的名称空间中求值,而不管传递给eval的是全局的还是局部的?

EN

回答 2

Stack Overflow用户

发布于 2017-04-04 05:41:04

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

票数 1
EN

Stack Overflow用户

发布于 2017-04-04 05:41:17

nonlocal引用函数定义的父作用域,而不是调用站点。将局部变量传递到eval中时,不会更改所调用函数中的局部变量,而是为要计算的代码片段设置局部变量。因此,编写eval('sub1()', globals(), locals()等同于编写sub1(),因为无论哪种方式,相同的局部变量都在作用域中-如果是您编写的,sub1不会返回6,不是吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43194578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档