目录

  • 原文链接
  • eval()函数
    • 函数原型:
      • 参数
      • 注意
    • 参数使用实例:
      • 省略 globals,locals 参数
      • globals指定的情况下
      • locals指定的情况下
    • 实际使用实例
      • 例一:
      • 示例二:
      • 示例三:
      • 示例四:

原文链接

eval()函数

函数原型:

eval(expression,globals = None,locals = None )
参数
  • expression:这个参数是一个字符串,python会使用globals字典和locals字典作为全局和局部的命名空间,将expression当做一个python表达式(从技术上讲,是一个条件列表)进行解析和计算
  • globals:这个参数管控的是一个全局的命名空间,也就是我们在计算表达式的时候可以使用全局的命名空间中的函数,如果这个参数被提供了,并且没有提供自定义的__builtins__,那么会将当前环境中的__builtins__拷贝到自己提供的globals里,然后才会进行计算。关于__builtins__,它是python的内建模块,也就是python自带的模块,不需要我们import就可以使用的,例如我们平时使用的int、str、abs等都在这个模块中。如果globals没有被提供,则使用python的全局命名空间。
  • locals:这个参数管控的是一个局部的命名空间,和globals类似,不过当它和globals中有重复的部分时,locals里的定义会覆盖掉globals中的,也就是当globals和locals中有冲突的部分时,locals说了算,它有决定权,以它的为准。如果locals没有被 提供的话,则默认为globals。
注意
  • eval函数也可以被用来执行任意的代码对象(如那些由compile()创建的对象)。在这种情况下,expression参数是一个代码对象而不是一个字符串。如果代码对象已经被‘exec‘编译为模式参数,eavl()的返回值是None。

参数使用实例:

省略 globals,locals 参数
a = 10
print(eval("a+10"))
# 输出:20
  • 分析:后两个参数省略了,所以eval中的a是前面的10。对于eval,它会将第一个expression字符串参数的引号去掉,然后对引号中的式子进行解析和计算。
globals指定的情况下
a = 10
g = {'a':5}
print(eval('a+10',g))
# 输出:15
  • 分析:在这次的代码中,我们在 eval中提供了globals参数,这时候eval的作用域就是g指定的这个字典了,也就是外面的a=10被屏蔽掉了,eval是看不见的,所以使用了a为5的值。
locals指定的情况下
a = 10
b = 20
c = 30
g = {'a':1,'b':2}
l = {'b':200,'c':3}
print(eval("a+b+c",g,l))
# 输出:204
  • 分析:此次执行的结果中,a是1,b是200,c是3。我们首先来看一下,对于a为1我们是没有疑问的,因为在上个例子中已经说了,g会屏蔽程序中的全局变量的,而这里最主要的是为什么b是100呢?还记得我们在参数介绍的时候说过,当locals和globals起冲突时,locals是起决定作用的

实际使用实例

例一:
s="abck"
print(eval(s))# 输出:NameError: name 'abck' is not defined
  • 分析:字符串s并不满足表达式的要求。当eval剥去了"abck"的外面的引号的时候,它会对它进行解析,然后满足要求后进行计算,然后它解析到的是abcd,请注意,程序报出的错误是NameError,也就是说,当它解析到这个表达式是不可以计算后,它就会查找它是不是一个变量的名字,如果是一个变量的名字,那么它会输出这个变量的内容,否则就会产生这种报错。
s="abck"
print(eval('s'))
#输出:abck
  • 分析:eval首先将‘s’的引号剥去,然后得到的是s,显然这个是不可以进行计算的,那么它就开始查找s是否是一个变量的名字,然后它一查找,果然s是一个字符串,所以程序输出了s中的内容
示例二:
s='"sas"'
print(eval(s))
# 输出:sas
  • 分析:eval首先去除单引号,eval在执行的时候是只会去除同种类型的引号的,对于单引号和双引号它是加以区分的。eval去除单引号后得到了“sas”,这个时候程序解析到它是一个字符串,不可以计算,就输出了它。那么不禁想问,为什么上个例子中s="abck"会不行呢,这里面我们就可以看出区别了,一个是有引号括起来的,一个是没有的,引号括起来代表字符串,虽然不可以求值,但是是有意义的,可以进行输出,而没引号的便无法判断“身份”了,只能当做变量名进行解析,而abck并不是一个变量名,所以就报错了。

  • 同理:

s='["a","b","c"]'
print(eval(s))
# 输出:['a', 'b', 'c']
示例三:
a = 10
b = 20
c = 30
s = '[a,b,c]'
print(eval(s))
# 输出:[10, 20, 30]
  • 分析:eval检查到列表的‘[’‘]’符号时,是会对里面的元素进行解析的,这里a、b、c显然不是具体的数据,便去查找它们是否是变量名,然后确认是变量名后,用它们的内容替换掉它。
示例四:
s = 'abs(10)'
print(eval(s))
# 输出:10
  • 分析:对于这个程序,我们举的是一个满足计算的一个表达式,当eval剥去s的引号后,得到abs(10),然后它会对进行解析,这个解析我们前面介绍eval的时候说过,它会使用globals的内建模块__builtins__进行解析的,在这个内建模块中是有abs这个函数的,所以对abs(10)进行了计算。

  • 关于__builtins__模块中有哪些东西 ,我们可以这样查看

print(dir(__builtins__))

Python的eval函数详解相关推荐

  1. Python内置函数详解——总结篇

      引 言 国庆期间下定决心打算学习Python,于是下载安装了开发环境.然后问题就来了,怎么开始呢?纠结一番,还是从官方帮助文档开始吧.可是全是英文啊,英语渣怎么破?那就边翻译边看边实践着做吧(顺便 ...

  2. chatgpt赋能python:Python取ln函数详解:用法及常见问题解答

    Python取ln函数详解:用法及常见问题解答 Python取ln函数是一种非常常用的数学函数,它可以帮助开发者在计算中处理数据的自然指数对数.本篇文章将会介绍Python中取ln函数的基础知识,让您 ...

  3. blankcount函数python,Python pandas常用函数详解

    本文研究的主要是pandas常用函数,具体介绍如下. 1 import语句 2 文件读取 df = pd.read_csv(path='file.csv') 参数:header=None 用默认列名, ...

  4. python基础知识~ 函数详解2

    python~函数详解2  1 生成器函数    定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数   须知 yield和return一样,都可以返回数 ...

  5. python的super函数详解

    python基础知识 用于类继承的super函数介绍 目录 python基础知识 一.super函数的用途 二.了解super函数的基本信息 三.多继承不重复调用 四.多继承重复调用 总结 一.sup ...

  6. Python正则表达式所有函数详解

    文章目录 1 fullmatch 2 match 3 search 4 findall 5 finditer 6 split 7 sub 8 compile 本篇博客主要讲解正则表达式相关的函数,均不 ...

  7. makefile eval函数详解

    函数功能:函数"eval"是一个比较特殊的函数.使用它可以在Makefile中构造一个可变的规则结构关系(依赖关系链),其中可以使用其它变量和函数.函数"eval&quo ...

  8. python中zip函数详解_Python中zip函数用法

    看openstack的代码,遇到一个内建函数zip不明白其意思: # Adjust the weights in the grid by the functions weight adjustment ...

  9. python读取数据的函数详解_你了解文件缓存机制吗?磁盘文件如何读写?Python中open函数详解...

    我们知道,在使用Python打开一个文件时,一般使用的是open()函数,但是你真正了解这个函数么?文件打开后如何进行缓存?对于大文件它是如何处理的?今天,小编带你来详细了解一下-- Python如何 ...

  10. python内置函数详解总结篇_Python内置函数详解——总结篇

    数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作(8个) 变量操作(2个) 交互操作(2个) 文件操作(1个) 编译执行(4个) 装饰器(3个) 数学运算 abs:求 ...

最新文章

  1. C(第一个C程序) 和 C++ (第一个C++程序)对比碰撞
  2. 论文被scoop(抢先发表)是怎样一种体验?
  3. 利用FreeNas创建WebDAV共享并实现ssl加密
  4. Eclipse/Myeclipse生成serialVersionUID方法
  5. Docker Vs Podman
  6. 用非递归方式实现二叉树中序遍历
  7. Spring REST:异常处理卷。 2
  8. [Linux] VIM 代码折叠
  9. ES6的class方法基本用法
  10. Shell shift的使用方法
  11. Adobe Reader 9.0记住阅读位置
  12. 算法笔记-----归并排序
  13. 记12306货运系统“抢订空车”插件的编写--chrome插件各部分的交互
  14. css3顺时,CSS3 - 顺时针旋转比逆时针
  15. 探究人工智能辅助新时代心理学研究
  16. 二级域名分发系统美化版网站源码 附搭建教程
  17. vue接口总是请求超时_解决在vue中axios请求超时的问题
  18. 【檀越剑指大厂--redis】redis基础篇
  19. 电商时代得流量者得天下,思域流量要怎么做
  20. AD转换中知道数字量计算模拟量或温度

热门文章

  1. VsCode+PHP开发 推荐插件
  2. 请求图片链接,为什么有的图片直接展示,有的图片就直接进行下载?
  3. C程序设计语言逆波兰式计算器学习心得
  4. PyTorch搭建LSTM实现时间序列预测(负荷预测)
  5. 只需一个损失函数,一个超参数即可压缩BERT,MSRA提模型压缩新方法
  6. 7-2 Binomial Queue
  7. pytorch学习笔记九:权值初始化
  8. 电脑怎么设置开机密码?简单几步给你的电脑“上锁”
  9. 系统时间与格林威治时间
  10. Lucene--千锋修改+踩坑版本