[笔记]Python虚拟机对创建基本内置对象的执行过程

简介:
同样的,有demo.py代码如下:
i = 1
s = "Python"
d = {"1":1, "2":2}
l = [2, 3]

有test.py代码如下:
import dis

source = open('./demo.py').read()
co = compile(source, './demo.py', 'exec')

dis.dis(co)

输出如下:
  1           0 LOAD_CONST               0 (1)
              3 STORE_NAME               0 (i)

  2           6 LOAD_CONST               1 ('Python')
              9 STORE_NAME               1 (s)

  3          12 BUILD_MAP                2
             15 LOAD_CONST               0 (1)
             18 LOAD_CONST               2 ('1')
             21 STORE_MAP           
             22 LOAD_CONST               3 (2)
             25 LOAD_CONST               4 ('2')
             28 STORE_MAP           
             29 STORE_NAME               2 (d)

  4          32 LOAD_CONST               3 (2)
             35 LOAD_CONST               5 (3)
             38 BUILD_LIST               2
             41 STORE_NAME               3 (l)
             44 LOAD_CONST               6 (None)
             47 RETURN_VALUE  

这里需要讨论的就是字典和列表的创建。

对于d = {"1":1, "2":2}这一语句,Python虚拟机首先是执行BUILD_MAP:
        case BUILD_MAP:
            x = _PyDict_NewPresized((Py_ssize_t)oparg);
            PUSH(x);
            if (x != NULL) continue;
            break;

接着把键值对压栈,然后执行STORE_MAP:
        case STORE_MAP:
            w = TOP();     /* key */
            u = SECOND();  /* value */
            v = THIRD();   /* dict */
            STACKADJ(-2);
            assert (PyDict_CheckExact(v));
            err = PyDict_SetItem(v, w, u);  /* v[w] = u */
            Py_DECREF(u);
            Py_DECREF(w);
            if (err == 0) continue;
            break;

因为刚才把键值对压栈了,所以现在栈顶是key,第二个是value,第三个是字典对象,栈指针-2,然后把键值对放入字典对象中。
接着再插入一个键值对,然后执行STORE_NAME,把字典对象d放入局部符号表中。

对于l = [2, 3]这一语句,Python虚拟机先是把两个元素压栈,然后执行BUILD_LIST,携带参数2:
        case BUILD_LIST:
            x =  PyList_New(oparg);
            if (x != NULL) {
                for (; --oparg >= 0;) {
                    w = POP();
                    PyList_SET_ITEM(x, oparg, w);
                }
                PUSH(x);
                continue;
            }
            break;

Python虚拟机根据命令参数决定出栈多少个元素放入列表中,最后一样是把列表对象l出栈,放入局部符号表中。
目录
打赏
0
相关文章
Leecode 101刷题笔记之第五章:和你一起你轻松刷题(Python)
这篇文章是关于LeetCode第101章的刷题笔记,涵盖了多种排序算法的Python实现和两个中等难度的编程练习题的解法。
31 3
深度解密 Python 虚拟机的执行环境:栈帧对象
深度解密 Python 虚拟机的执行环境:栈帧对象
82 13
【Python项目】外星人入侵项目笔记
【Python项目】外星人入侵项目笔记
54 3
|
3月前
|
【免费分享编程笔记】Python学习笔记(二)
【免费分享编程笔记】Python学习笔记(二)
52 0
【免费分享编程笔记】Python学习笔记(二)
|
3月前
|
Leecode 101刷题笔记之第四章:和你一起你轻松刷题(Python)
这篇博客是关于LeetCode上使用Python语言解决二分查找问题的刷题笔记,涵盖了从基础到进阶难度的多个题目及其解法。
26 0
|
3月前
|
Leecode 101刷题笔记之第三章:和你一起你轻松刷题(Python)
本文是关于LeetCode算法题的刷题笔记,主要介绍了使用双指针技术解决的一系列算法问题,包括Two Sum II、Merge Sorted Array、Linked List Cycle II等,并提供了详细的题解和Python代码实现。
25 0
|
3月前
|
Leecode 101刷题笔记之第二章:和你一起你轻松刷题(Python)
本文是关于LeetCode 101刷题笔记的第二章,主要介绍了使用Python解决贪心算法题目的方法和实例。
20 0
Python错误笔记(一):CUDA initialization: CUDA unknown error - this may be due to an incorrectly set up env
这篇文章讨论了CUDA初始化时出现的未知错误及其解决方案,包括重启系统和安装nvidia-modprobe。
363 0
|
3月前
|
【免费分享编程笔记】Python学习笔记(一)
【免费分享编程笔记】Python学习笔记(一)
50 0
用一篇文章告诉你如何篡改 Python 虚拟机
用一篇文章告诉你如何篡改 Python 虚拟机
29 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等