• eval函数


    eval内置函数

    eval是Python的一个内置函数,这个函数的作用是,把字符串当成有效的表达式来求值并返回计算结果。

    eval(expression[, globals[, locals]])
    

    expression : 字符串
    globals : 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
    locals : 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

    a = "[[1,2], [3,4]]"
    b = eval(a)         # [[1, 2], [3, 4]]
    type(b)             # list
    a = "{0: 'a', 1: 'b'}"
    b = eval(a)         #  {0: 'a', 1: 'b'}
    type(b)             # dict
    a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
    b = eval(a)         #  ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
    

      

    eval("{'student':'liming','age':age}",{"age":20})          #{'student': 'liming', 'age': 20}
    
    age=18
    eval("{'student':'liming','age':age}",{"age":20},locals())  #{'student': 'liming', 'age': 18}
    

    当locals参数为空,globals参数不为空时,查找globals参数中是否存在变量,并计算。当两个参数都不为空时,先查找locals参数,再查找globals参数,locals参数中同名变量会覆盖globals中的变量。

    print(eval('a+b', {'a': 8, 'b': 9})) #17
    d={'c': 1, 'b': 2}
    e={'a': 8, 'b': 9}
    print(eval('a+b', e, d))      # print(eval('a+b', {'a': 8, 'b': 9}, {'c': 1, 'b': 2}))  10
    print(e)                            # {'a': 8, 'b': 9}
    print(d)                            # {'c': 1, 'b': 2}

    eval 后面2个参数的作用,相当于给表达式添加临时的作用域,并不会污染真正的globals(), locals()变量的值,仅仅通过字典即可完成作用域的传递。

    eval的使用注意事项

    eval有安全的隐患,除了将字符串转成表达式并执行,也可以利用执行系统命令,删除文件等操作。
    需要防止恶意输入。比如:

    eval("__import__('os').system('ls /Users/secret/')")            #os.system('ls /Users/secret/')
    eval("__import__('os').system('cat /Users/secret/secret.txt')") 
    eval("__import__('os').system('rm /Users/secret/major.txt')") 
    

      

    【参考文献】https://blog.csdn.net/liuchunming033/article/details/87643041

  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/chenyuting/p/12157711.html
Copyright © 2020-2023  润新知