python dis模块解析

Python代码是编译成字节码(Bytecode)再放到CPython编译器中执行,而dis模块可以将python代码分解为字节码。先上一段代码

在输出中,11代表原python代码所在的行数,0代表指令LOAD_CONST的位置索引(在跳转指令中会用到这个索引),LOAD_CONST是人类可读的python字节码指令,它可以以opcode(操作码)100来表示;1表示LOAD_CONST指令的参数,(2)表示该参数对应的值为2。其实可以把1看成是一个字典的key,其对应的value就是2

那么第一行输出在干什么呢?查阅官方文档可以得到指令LOAD_CONST的解释

 co_consts是一个记录常量东西,consti是1(1应该是系统自动分配的),其对应的值是2,即co_consts[1]=2,所以第一行就是把2放入栈顶。

那么第二行就很好理解了,STORE_FAST的解释为

TOS是top of stack的缩写,也就是栈顶的意思。 co_varnames是记录变量的东西,0应该也是系统自动分配的,其对应的变量是x,即co_varnames[0]=x, 于是这句指令就把栈顶的元素取出来赋值给x了。到目前为止已经完成了x=2句代码的操作完成了

再来分析第三行的代码,第一句是LOAD_FAST

 LOAD_FAST的参数var_num是0,而co_varnames[0]=x,于是就把x放入栈顶了

第四行的指令LOAD_CONST:

 参数consti为2,而co_consts[2]=1,于是这条语句又把1放入了栈顶

第五行指令INPLACE_ADD:

其把栈顶的两个元素TOS=1和TOS1=x=2相加,再覆盖栈顶元素,于是此时栈顶的元素就是1+2=3了

第六行指令STORE_FAST把栈顶元素存入x,于是x=3;到这里x+=1这句代码就操作完成了。

贴一张栈的变化过程图

dis.code_info(func)可以查看一些信息

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值