Python内置函数--exec()
admin
2024-02-03 02:00:54

它与eval()类似

源码

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

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

小例子

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

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)
# {}

全局

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

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

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

局部

def func():q = 3g = {"n": 9}l = {}exec("a=1+1")print(l)print(a)
func()

这样是不被允许的。错误提示: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 = 3g = {"n": 9}l = {}exec("a=1+1",g,l)print(l)
func()

相关内容

热门资讯

分析攻击手段,给出防范建议,专... 12月22日晚间,快手直播平台的多个直播间突然播放违规内容,快手称平台遭到黑灰产攻击并已报警。快手公...
唐山最新或2023(历届)直招...   5月15日,记者从唐山市征兵办获悉,唐山市普通高校毕业生直招士官工作已经开始,报名截止日期为5月...
廊坊市最新或2023(历届)入...   报名时间为5月11日至5月底可以网上预征报名  近日,记者从河北省廊坊市征兵办公室了解到,今年我...
宣化科技职业学院最新或2023...  根据总参部《关于做好从普通高等学校毕业生中直接招收士官工作的通知》精神和各省、自治区人民政府征兵办...
河北最新或2023(历届)直招... 昨日(4月27日),记者从河北省公安消防总队获悉,公安部消防局首次面向普通高等学校毕业生直接招收士官...