码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Python内置函数--exec()


    它与eval()类似

    源码

    def exec(
        __source: str | bytes | CodeType, __globals: dict[str, Any] | None = ..., __locals: Mapping[str, Any] | None = ...
    ) -> Any: ...
    
    • 1
    • 2
    • 3

    1、源可以是表示Python表达式的字符串或编译器()返回的代码对象
    2、全局:全局必须是字典
    3、局部变量:局部可以是任何映射***

    小例子

    q = 3
    g = {"n":9}
    l = {}
    exec("a=1+1", g, l)
    print(l)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    i是全局名称空间,g是局部名称空间。它会将第一个参数产生的值存入到局部中,我们可以通过打印局部得到结果。

    如果没有a亦或者局部中本来就存在一个键值对呢,一起看看:

    """g中有值"""
    q = 3
    g = {"n": 9}
    l = {"b": 1}
    exec("1+1", g, l)
    print(l)
    # {"b": 1}
    """g中无值"""
    q = 3
    g = {"n": 9}
    l = {}
    exec("1+1", g, l)
    print(l)
    # {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    全局

    当我不定义全局以及局部的时候:

    q = 3
    g = {"n": 9}
    l = {}
    exec("a=1+1")
    print(l)
    print(a)
    """
    {}
    2
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在编译器上a会提示你有误(红色下划线)。但是依然可以输出。
    前面说了,是默认传入局部的,但是上述错处本身就在全局,所以全局打印是可以得到结果的。

    局部

    def func():
        q = 3
        g = {"n": 9}
        l = {}
        exec("a=1+1")
        print(l)
        print(a)
    func()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这样是不被允许的。错误提示:NameError: name ‘a’ is not defined,名字没有定义。为什么呢?
    在上述中,全局中使用局部是被允许的,那是因为在这背后有一个绑定的过程,全局使用locals等同于使用globals。
    exec(“a=1+1”),其默认是:exec(“a=1+1”,globals(),locals())。在上述中,需要分清的是,locals的值并未与当前的局部空间绑定,所以func函数不认识a。所以我们可以传入g,l进去绑定一下:

    def func():
        q = 3
        g = {"n": 9}
        l = {}
        exec("a=1+1",g,l)
        print(l)
    func()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    Python之父加入微软三年后,Python嵌入Excel!
    Codeforces Round #816 (Div. 2)
    linux异步IO通知
    【熬夜爆肝版】JAVA基础入门专栏——1.JAVA开发入门
    【Linux篇】第十三篇——信号(概念+信号的产生+阻塞信号+捕捉信号)
    MySQL创建数据表(CREATE TABLE语句)
    Power BI----几个常用的分析方法和相适应的视觉对象
    羽夏 Bash 简明教程(上)
    docker搭建ELK
    参与开源之夏 x OpenTiny 跨端跨框架 UI 组件库贡献,可以赢取奖金🏆!这份《OpenTiny 开源贡献指南》请收好🎁!
  • 原文地址:https://blog.csdn.net/weixin_52040868/article/details/127946244
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号