Python中的exec、eval函数与作用域(scope)

本文探讨了Python中的exec和eval函数,重点介绍了它们在动态代码执行中的应用和作用域影响。exec允许动态创建代码字符串,通过提供命名空间来确保安全,而eval则用于计算Python表达式并返回结果。尽管eval通常不改变变量,但它仍可能通过调用函数影响全局变量。文章通过例子展示了这两个函数如何与作用域交互。
摘要由CSDN通过智能技术生成

Python2与Python3的语法区别引起了我对exec的注意,进而探讨一下python的命名空间(作用域)

exec()函数

exec()最有用的地方在于可以动态地创建代码字符串。然而,如果字符串是从其他地方获得的——很有可能是用户——那么几乎不能确定其中到底包含什么代码。所以为了安全起见,可以增加一个字典,起到命名空间的作用。
例:

# Python2版:
from math import sqrt
scope = {
   }
exec 'sqrt = 1' in scope
print(sqrt(4))
print(scope['sqrt'])

#Python3版:
from math import sqrt
scope = {
   }
exec('sqrt = 1', scope)
print(sqrt(4))
print(scope['sqrt'])

#输出为
2.0
1

可以看到,潜在的破坏性代码并不会覆盖sqrt函数,原来的函数能正常工作,而通过exec赋值的变量sqrt只在它的作用域内有效。

这时如果将scope打印出来的话,会看到其中包含很多东西,
因为內建的_builtins_字典自动包含所有的內建函数和值。

{'__builtins__': 
  {'__name__': 'builtins', 
  '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", 
  '__package__': '', 
  '__loader__': <class '_frozen_importlib.BuiltinImporter'>,    
  '__spec__': ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>), 
  '__build_class__': <bui
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值