python中关于eval函数的使用及说明

 更新时间:2023年05月29日 17:14:48   作者:涤生大数据  
这篇文章主要介绍了python中关于eval函数的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

eval是Python的一个内置函数,功能十分强大,这个函数的作用是,返回传入字符串的表达式的结果。

就是说:将字符串当成有效的表达式 来求值 并 返回计算结果。

eval函数就是实现list、dict、tuple与str之间的转化,同样str函数把list,dict,tuple转为为字符串

1.eval的语法

eval(expression[, globals[, locals]])
  • expression : 表达式。
  • globals : (可选参数)变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
  • locals : (可选参数)变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

既然eval有两个可选参数是命名空间,那么先搞清楚啥是命名空间吧?

2.命名空间

定义

名称到对象的映射。python是用命名空间来记录变量的轨迹的,命名空间是一个dictionary,键是变量名,值是变量值。各个命名空间是独立没有关系的,一个命名空间中不能有重名,但是不同的命名空间可以重名而没有任何影响。

分类

python程序执行期间会有2个或3个活动的命名空间(函数调用时有3个,函数调用结束后2个)。按照变量定义的位置,可以划分为以下3类:

  • Local,局部命名空间,每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量。
  • Global,全局命名空间,每个模块加载执行时创建的,记录了模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量。
  • Built-in,python自带的内建命名空间,任何模块均可以访问,放着内置的函数和异常。

生命周期

  • Local(局部命名空间)在函数被调用时才被创建,但函数返回结果或抛出异常时被删除。(每一个递归函数都拥有自己的命名空间)。
  • Global(全局命名空间)在模块被加载时创建,通常一直保留直到python解释器退出。
  • Built-in(内建命名空间)在python解释器启动时创建,一直保留直到解释器退出。

各命名空间创建顺序:

python解释器启动 ->创建内建命名空间 -> 加载模块 -> 创建全局命名空间 ->函数被调用 ->创建局部命名空间

各命名空间销毁顺序:

函数调用结束 -> 销毁函数对应的局部命名空间 -> python虚拟机(解释器)退出 ->销毁全局命名空间 ->销毁内建命名空间

python解释器加载阶段会创建出内建命名空间、模块的全局命名空间,局部命名空间是在运行阶段函数被调用时动态创建出来的,函数调用结束动态的销毁的。

python的全局命名空间存储在一个叫globals()的dict对象中;局部命名空间存储在一个叫locals()的dict对象中。

可以用print (locals())来查看该函数体内的所有变量名和变量值。

print(locals())  #打印显示所有的局部变量
'''
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001B22E13B128>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/pythoyworkspace/file_demo/Class_Demo/pachong/urllib_Request1.py',
'__cached__': None, 's': '1+2+3*5-2', 'x': 1, 'age': 18}
Process finished with exit code 0

3.参数查找

当后两个参数都为空时,很好理解,就是一个string类型的算术表达式,计算出结果即可。等价于eval(expression)。

当locals参数为空,globals参数不为空时,先查找globals参数中是否存在变量,并计算。

当两个参数都不为空时,先查找locals参数,再查找globals参数。

4.eval的使用演示

#1.eval无参实现字符串转化
s = '1+2+3*5-2'
print(eval(s))  #16
#2.字符串中有变量也可以
x = 1
print(eval('x+2'))  #3
#3.字符串转字典
print(eval("{'name':'linux','age':18}"))
#输出结果:{'name':'linux','age':18}
#4.eval传递全局变量参数,注意字典里的:age中的age没有带引号,说明它是个变量,而不是字符串。
#这里两个参数都是全局的
print(eval("{'name':'linux','age':age}",{"age":1822}))
#输出结果:{'name': 'linux', 'age': 1822}
print(eval("{'name':'linux','age':age}",{"age":1822},{"age":1823}))
#输出结果:{'name': 'linux', 'age': 1823}
#eval传递本地变量,既有global和local时,变量值先从local中查找。
age=18
print(eval("{'name':'linux','age':age}",{"age":1822},locals()))
#输出结果:{'name': 'linux', 'age': 18}
print("-----------------")
print(eval("{'name':'linux','age':age}"))

5.eval的使用与风险

python3中input将接受的结果存为字符串,一般来说,可以使用eval实现表达式的还原,并且实现表达式的计算

比如下面使用eval直接完成了表达式的还原与计算:

>>> s = input("输入一个表达式")
输入一个表达式:1+3+4+4*3
>>> print(eval(s))
20
>>>

eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。

比如用户恶意输入就会获得当前目录文件

>>>eval("__import__('os').system('dir')")
 驱动器 C 中的卷是 OS
 卷的序列号是 B234-8A38
 
 C:\Users\Robot_TENG 的目录
 
2019-07-01  09:11    <DIR>          .
2019-07-01  09:11    <DIR>          ..
2017-11-23  16:15    <DIR>          .android
2018-12-23  00:02    <DIR>          .conda
2018-12-06  19:08                20 .dbshell
2017-12-01  19:28    <DIR>          .eclipse
2018-01-22  22:46    <DIR>          .idea-build
2017-12-31  14:49    <DIR>          .IdeaIC2017.1
2018-01-22  21:21    <DIR>          .IdeaIC2017.2
2019-07-01  09:11    <DIR>          .ipynb_checkpoints
2018-12-19  20:04    <DIR>          .ipython
2019-07-01  09:30    <DIR>          .jupyter
2017-12-01  16:11    <DIR>          .m2
2017-12-31  23:14                 0 .mongorc.js
2019-02-03  22:52    <DIR>          .p2
2018-07-16  22:04    <DIR>          .PyCharm2016.1
2018-12-06  19:49    <DIR>          .rdm
2018-01-22  22:09               580 .scala_history
2018-12-06  19:19    <DIR>          .vscode
2019-06-21  16:37    <DIR>          3D Objects
2019-06-21  16:37    <DIR>          Contacts
2019-07-01  16:21    <DIR>          Desktop
2019-06-28  16:34    <DIR>          Documents
2019-06-28  10:26    <DIR>          Downloads
2018-09-11  22:24    <DIR>          Evernote
2019-06-21  16:37    <DIR>          Favorites
2018-08-02  23:58    <DIR>          HBuilder
2018-08-03  00:00    <DIR>          HBuilder settings
2018-08-03  00:02    <DIR>          HBuilderProjects
2019-06-21  16:37    <DIR>          Links
2019-06-21  16:37    <DIR>          Music
2018-03-18  00:22    <DIR>          Oracle
2019-06-21  16:37    <DIR>          Pictures
2019-06-21  16:37    <DIR>          Saved Games
2019-06-21  16:37    <DIR>          Searches
2018-12-23  00:47               690 Untitled.ipynb
2019-07-01  09:11                72 Untitled1.ipynb
2019-06-30  18:43    <DIR>          Videos
2019-01-13  18:20    <DIR>          Yinxiang Biji
               5 个文件          1,362 字节
              34 个目录 72,365,862,912 可用字节

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于Python时间日期常见的一些操作方法

    关于Python时间日期常见的一些操作方法

    Python的datetime模块是处理日期和时间的强大工具,datetime类可以获取当前时间、指定日期、计算时间差、访问时间属性及格式化时间,这些功能使得在Python中进行时间日期处理变得简单高效,需要的朋友可以参考下
    2024-09-09
  • python+selenium小米商城红米K40手机自动抢购的示例代码

    python+selenium小米商城红米K40手机自动抢购的示例代码

    这篇文章主要介绍了python+selenium小米商城红米K40手机自动抢购的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Python 代码调试技巧示例代码

    Python 代码调试技巧示例代码

    这篇文章主要介绍了Python 代码调试技巧,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Python图像处理Pillow库的安装使用

    Python图像处理Pillow库的安装使用

    本文详细介绍了Python第三方库Pillow的使用,通过导入Pillow库、打开和保存图像、基本图像操作以及图像处理高级功能的代码示例,我们了解了Pillow库的强大功能和灵活性,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • Python中暂存上传图片的方法

    Python中暂存上传图片的方法

    这篇文章主要介绍了Python中暂存上传图片的方法,本文使用cStringIO模块实现暂存功能,本文给出简单使用示例,需要的朋友可以参考下
    2015-02-02
  • pycharm上的python虚拟环境移到离线机器上的方法步骤

    pycharm上的python虚拟环境移到离线机器上的方法步骤

    本人在工作中需要在离线Windows环境中使用,本文主要介绍了pycharm上的python虚拟环境移到离线机器上的方法步骤,具有一定的参考价值,感兴趣的可以了解一下
    2021-10-10
  • python操作yaml的方法详解

    python操作yaml的方法详解

    这篇文章主要为大家介绍了python操作yaml的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • python 含子图的gif生成时内存溢出的方法

    python 含子图的gif生成时内存溢出的方法

    今天小编就为大家分享一篇python 含子图的gif生成时内存溢出的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python+seaborn实现联合分布图的绘制

    Python+seaborn实现联合分布图的绘制

    联合分布(Joint Distribution)图是一种查看两个或两个以上变量之间两两相互关系的可视化图,在数据分析操作中经常需要用到。本文将通过seaborn实现绘制联合分布图,需要的可以参考一下
    2023-02-02
  • Python-接口开发入门解析

    Python-接口开发入门解析

    这篇文章主要介绍了Python-接口开发入门解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论