[笔记]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出栈,放入局部符号表中。

时间: 2024-09-21 09:12:49

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

JavaScript高级程序设计 阅读笔记(十二) js内置对象Math_javascript技巧

Math对象的属性 E:值e,自然对数的底 LN10:10的自然对数 LN2:2的自然对数 LOG2E:以2为底E的对数 LOG10E:以10为底E的对数 PI:值派 SQRT1_2:1/2 的平方根 SQRT2:2的平方根 Math对象的方法:最大值与最小值 min()&&max()用于取一组数中的最小值跟最大值. 示例: 复制代码 代码如下: var iMax=Math.Max(1,2,3); alert(iMax);//outputs 3 var iMin=Math.Min(1,2,

编程基础讲解 续 (内置对象)

上次讲对象时讲了自定义对象,现在讲一下预定义对象(内置对象).毕竟as里是大量用到预定义对象的. 使用内置 Flash 对象访问和处理特定种类的信息.大多数内置对象都具有方法(分配给对象的函数),您可以调用这些方法,以返回值或执行动作.例如,Date 对象会从系统时钟返回信息,而 Sound 对象使您可以控制影片中的声音元素.某些内置对象还具有属性,您可以读取这些属性的值.例如,Key 对象具有恒定的值,它们代表键盘上的键.每个对象都具有自己的特性和能力,从而使它们在影片中很有用.内置 Flas

js内置对象 学习笔记_javascript技巧

mark相关的知识点: 首先,什么是js的内置对象,它包括了些什么内容?(以下内容转自网上资源的整合) (W3shool JS手册地址:http://www.jb51.net/w3school/js/js_reference.htm) 作为一门编程语言,JavaScript提供了一些内置的对象和函数.内置对象提供编程的几种最常用的功能.JavaScript内置对象有以下几种. ● String对象:处理所有的字符串操作 ● Math对象:处理所有的数学运算 ● Date对象:处理日期和时间的存储

《Abaqus GUI程序开发指南(Python语言)》——2.4 内置对象类型

2.4 内置对象类型 Python语言中提供了强大的对象类型作为语言的组成部分,内置对象使得程序编写更加容易,并且内置对象往往比自己定制的数据结构更有效率.Python语言中主要有如表2.1所示几类对象类型. 2.4.1 数字Python语言中的数字类型包括整型.浮点型.复数型等,与一般的C.C++等语言没有太大的区别,以下是几类数字类型的内置对象定义方法. [实例2.4]定义数字类型 >>>a=5+5 #定义整形数据 >>>a 10 >>> b=5*

JavaScript高级程序设计 读书笔记之十一 内置对象Global_javascript技巧

内置对象 定义:由ECMAScript实现提供的.独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现. 由定义可知开发者不必明确实例化内置对象,它已被实例化了.在ECMAScript-262只定义了两个内置对象,即Global和Math Global Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在. 由于在ECMAScript中不存在独立的对象,所有函数都必须是某个对象的方法,如前面提到的isNaN().isFinite().parseInt()和p

JavaScript核心参考教程--内置对象

博学,切问,近思--詹子知 (https://jameszhan.github.io) JavaScript 是根据 "ECMAScript"标准制定的网页脚本语言.这个标准由 ECMA 组织发展和维护.ECMA-262 是正式的 JavaScript 标准.这个标准基于 JavaScript (Netscape) 和 JScript (Microsoft).Netscape (Navigator 2.0) 的 Brendan Eich 发明了这门语言,从 1996 年开始,已经出现在

JavaWeb学习----JSP内置对象详解

[正文] 呼~~~花了一下午的时间,终于把JSP的内置对象的内容学完了,并做好了笔记,方便以后回顾. 今天是10月的最后一天,小小地总结一下吧,这个月共发表博客25篇(排版好麻烦的说),所有内容均由生命壹号本人敲键盘码起.基本是一天一篇,包括国庆的时候也是独霸教研室在学习,学习的大致内容也是和数据库.JavaWeb有关.毕竟以后搞开发不可能是单机吧,网络的部分是多么的重要.下个月要提高学习效率,学习任务要加大,争取早日进入工程实践,嘿嘿~~~ 菜鸟加油,恩,说我自己呢! 骚年矜持,恩,在说你咧!

JavaScript 核心参考教程 内置对象_js面向对象

这个标准基于 JavaScript (Netscape) 和 JScript (Microsoft).Netscape (Navigator 2.0) 的 Brendan Eich 发明了这门语言,从 1996 年开始,已经出现在所有的 Netscape 和 Microsoft 浏览器中.ECMA-262 的开发始于 1996 年,在 1997 年 7 月,ECMA 会员大会采纳了它的首个版本. 本系列教程旨在向大家分享本人当年学习Javascript的笔记和心得.本系列教程预计分五个部分. 第

ASP内置对象Request和Response详解

request|response|对象|内置对象|详解|内置对象     Request和Response这两个对象是ASP所提供的内置对象中最常用的两个.在浏览器(或其他用户代理)和Web服务器之间,请求与响应中发生的信息交流可以通过ASP中的两个内置对象来进行访问和管理,这两个对象称为Request和Response对象. 在ASP页中所要进行的工作几乎都要访问这两个对象,使用这两个对象的方式将影响页面的效率及可靠性.当然,它们的主要用途是访问用户发回到服务器的值,即从HTML页的<FORM