首页 > 编程语言 >python 虚拟机中的一般表达式-简单内建对象的创建

python 虚拟机中的一般表达式-简单内建对象的创建

时间:2022-11-07 15:11:18浏览次数:50  
标签:运行 字节 python 虚拟机 时栈 指令 locals 源码 表达式

对于一下代码

i = 1
s = 'python'
d = {}
l = []

解析编译后的pyc文件得到如下结果:
image
从字节码查看consts名字空间与names名字空间,得到以下结果:
image

在Python程序运行开始前,运行时栈与locals命名空间像下图所示那样:
image
当执行完"i=1"这条指令,字节码为:
image
LOAD_CONST指令源码如下:
image
表示从consts中读取对应序号的元素,压入运行时栈中。

当执行字节码"0 LOAD_CONST 0 (1)"时,运行时栈与locals名字空间变成了下边这样:
image
表示取consts中编号为0的元素(connsts中的元素见上边图片从字节码查看consts名字空间与names名字空间),然后将其压入运行时栈中。

STORE_NAME指令源码如下:
image
表示从符号中(names)中获取符号,然后从运行时栈中获取栈顶元素,再将(符号,值)得映射关系存到locals 名字空间中。

当执行字节码"2 STORE_NAME 0 (i)"时,运行时栈与locals名字空间变成了下边这样:
image
因为在STORE_NAME指令执行得过程中,执行了pop的动作,所以运行时栈为空了。

在执行第二句命令"s = 'python'",字节码为:
image
操作与第一句指令一样,只是值变了而已,所以运行时栈与locals名字空间的变化如下:
image

在执行第三句指令"d = {}",字节码为:
image

BUILD_MAP源码为:
image
表明创建一个字典,然后压入栈中(ps: 字节码指令中的参数0 并没有用到)。
所以当'd={}'的指令执行结束时,运行时栈与locals名字空间的变化如下:
image

对于第四句语句"l = []",字节码为:
image
对于这句指令,竟然编译出四条字节码指令。

BUILD_LIST源码为:
image
与BUILD_MAP类似,BUILD_LIST创建一个列表,但是会用到字节码中所带的指令参数,因为在创建列表的时候不一定是一个空的list, 那么在BUILD_LIST指令之前一定也会有许多LOAD_CONST的操作,先把列表中的元素压入运行时栈,在真正执行BUILD_LIST指令时,会将这些对象一一从栈中弹出,加入到新建的PyListObject对象中。

在执行“ 14 STORE_NAME 3 (l)”指令之后,似乎创建列表的工作完成了,也就是整个测试程序都执行完了,那么为什么会还有两句字节码呢?
原来Python在执行了一段Code Block后,一定要返回一些值,这两条字节码指令就是用来返回某些值得:
RETURN_VALUE指令源码如下:
image
从源码可以看出,实际得返回值retval是从运行时栈中获得到。所以RETURN_VALUE之前的那句“16 LOAD_CONST 2 (None)”命令的作用就不言而喻了。就是将返回值压入运行时栈中,以供RETURN_VALUE指令使用。可以看到压入栈中的十一个NoneObject,实际是没什么意义的东西,但这个过程还是要走。

最终运行时栈与locals名字空间变成了如下这样:
image
运行时栈已经边空,所有有用的信息都已经加载到locals名字空间的掌控之中。

标签:运行,字节,python,虚拟机,时栈,指令,locals,源码,表达式
From: https://www.cnblogs.com/yimeimanong/p/16865256.html

相关文章

  • 什么是 Python?Python 基础编程入门指南
    Python是当今最流行的编程语言之一。Python以其简单的语法和多功能性而闻名,既易于学习又可用于高级应用程序。可以使用Python的领域也非常广泛,人工智能、机器学习、Web开......
  • python二十九课--对象的封装与多态等知识
    上周内容回顾动静态方法类体代码中编写的函数有三种类型1.绑定给对象的方法:对象调用自动当做第一个参数传入 类中直接定义函数 classC1:def......
  • 正则表达式
    快速入门底层实现底层分析分组正则表达式语法字符匹配符选择匹配符限定符定位符捕获分组非捕获分组非贪婪匹配实例正则表达式......
  • python装饰器
    装饰器是在不修改目标函数代码的前提下,为目标函数新增功能的函数使用场景:为函数新增功能,解决重复性的操作,是的代码简洁,更模块化性能测试,打印日志等通过@调用装饰器impo......
  • 『Python核心技术与实战』列表和元组,到底用哪一个?
    列表和元组,到底用哪一个?文章目录​​一.列表和元组区别​​​​二.列表和元组基本操作与注意事项​​​​三.列表和元组存储方式的差异​​​​四.列表和元组的性能​​......
  • (vs + qt )c++ 调用 python 问题处理
    问题1.PyImport_ImportModule返回总是nullPyObject*pModule=PyImport_ImportModule("test2");//如果加载失败,则返回 if(!pModule){ std::cout<<"WhyCan'top......
  • python冒泡排序
     理解:始终拿0位置的值,依次与后面位置的进行比较;比较时,谁小,谁就放在0位置  ......
  • python爬虫,爬取51job 智联 58同城
    口182480171有源码和lun文词云图 ......
  • Vmware虚拟机突然连接不上网络
    方法一:网络连接状态排查出现该问题,第一步进行网络状态排查,通常也是最有效的方法之一。进入Ctrl+Alt+T打开终端,输入以下命令,查看网络状态信息。sudovim/var/lib/Network......
  • Python基础之迭代器
    一、什么是迭代器迭代是python中访问集合元素的一种非常强大的一种方式。迭代器是一个可以记住遍历位置的对象,因此不会像列表那样一次性全部生成,而是可以等到用的时候才生......