Python字节码中列表构建流程的疑惑及正误确认
Python列表构建字节码流程解析
首先是你给出的测试代码:
import dis def f(): a=[1,2,3] dis.dis(f)
执行后得到的字节码输出:
2 0 RESUME 0 3 2 BUILD_LIST 0 4 LOAD_CONST 1 ((1, 2, 3)) 6 LIST_EXTEND 1 8 STORE_FAST 0 (a) 10 LOAD_CONST 0 (None) 12 RETURN_VALUE
你的猜测并不正确,每个指令的实际作用如下:
BUILD_LIST 0:创建一个空列表,把这个空列表的引用推到虚拟机栈顶。参数0表示初始预分配的元素容量为0,后续会根据需要扩展,并非标记或占位符。LOAD_CONST 1:将常量池中索引为1的元组(1,2,3)作为一个整体推入栈顶。此时栈内从底到顶的结构是:[空列表引用, 元组(1,2,3)],并不是把元组元素逐个推入。LIST_EXTEND 1:参数1代表从栈顶取出1个可迭代对象(也就是这个元组),然后把该可迭代对象的所有元素添加到之前创建的空列表里。执行完后,元组会被弹出栈,栈顶剩下的就是填充好元素的列表引用。STORE_FAST 0 (a):弹出栈顶的列表引用,将其绑定到局部变量a(对应局部变量表中索引为0的位置)。
内容的提问来源于stack exchange,提问作者onlycparra
相关产品推荐
相关产品推荐

