解包是如何操作?
>>> a, b = [1, 2]
# 以下为此解包操作的字节码
0 LOAD_CONST 1 (1)
2 LOAD_CONST 2 (2)
4 BUILD_LIST 2
6 UNPACK_SEQUENCE 2
8 STORE_FAST 0 (a)
10 STORE_FAST 1 (b)
核心操作很明显是UNPACK_SEQUENCE所以我们称这个过程为解包
大致功能为 把栈顶元素打包成单独的计数值,然后再把这些值从右到左放入堆栈中
在源码中的实现为
// 源码版本为3.7.4
// ceval.c
TARGET(UNPACK_SEQUENCE) {
PyObject *seq = POP(), *item, **items;
if (PyTuple_CheckExact(seq) &&
PyTuple_GET_SIZE(seq) == oparg) {
items = ((PyTupleObject *)seq)->ob_item;
while (oparg--) {
item = items[oparg];
Py_INCREF(item);
PUSH(item);
}
} else if (PyList_CheckExact(seq) &&
PyList_GET_SIZE(seq) == oparg) {
items = ((PyListObject *)seq)->ob_item;