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)可以查看一些信息