这篇文章主要介绍“Python虚拟机中列表的实现原理是什么”,在日常操作中,相信很多人在Python虚拟机中列表的实现原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python虚拟机中列表的实现原理是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!在 cpython 实现的 python 虚拟机当中,下面就是 cpython 内部列表实现的源代码:将上面的结构体展开之后,PyListObject 的结构大致如下所示:现在来解释一下上面的各个字段的含义:Py_ssize_t,一个整型数据类型。ob_refcnt,表示对象的引用记数的个数,这个对于垃圾回收很有用处,后面我们分析虚拟机中垃圾回收部分在深入分析。ob_type,表示这个对象的数据类型是什么,在 python 当中有时候需要对数据的数据类型进行判断比如 isinstance, type 这两个关键字就会使用到这个字段。ob_size,这个字段表示这个列表当中有多少个元素。ob_item,这是一个指针,指向真正保存 python 对象数据的地址,大致的内存他们之间大致的内存布局如下所示:allocated,这个表示在进行内存分配的时候,一共分配了多少个 (PyObject *) ,真实分配的内存空间为allocated * sizeof(PyObject *)
。首先需要了解的是在 python 虚拟机内部为列表创建了一个数组,所有的创建的被释放的内存空间,并不会直接进行释放而是会将这些内存空间的首地址保存到这个数组当中,好让下一次申请创建新的列表的时候不需要再申请内存空间,而是直接将之前需要释放的内存直接进行复用即可。free_list,保存被释放的内存空间的首地址。numfree,目前 free_list 当中有多少个地址是可以被使用的,事实上是 free_list 前 numfree 个首地址是可以被使用的。创建链表的代码如下所示(为了精简删除了一些代码只保留核心部分):在 cpython 当中,创建链表的字节码为 BUILD_LIST,我们可以在文件 ceval.c 当中找到对应的字节码对应的执行步骤:从上面 BUILD_LIST 字节码对应的解释步骤可以知道,在解释执行字节码 BUILD_LIST 的时候确实调用了函数 PyList_New 创建一个新的列表。在上面的扩容机制下,数组的大小变化大致如下所示:newsize≈size⋅(size+1)1/8在列表当中插入一个数据比较简单,只需要将插入位置和其后面的元素往后移动一个位置即可,整个过程如下所示:在 cpython 当中列表的插入函数的实现如下所示:参数 op 表示往哪个链表当中插入元素。参数 where 表示在链表的哪个位置插入元素。参数 newitem 表示新插入的元素。对于数组 ob_item 来说,删除一个元素就需要将这个元素后面的元素往前移动,因此整个过程如下所示:执行的 python 程序内容为:下面是整个修改内容和报错结果:从上面的结果我们可以看到的是,我们修改的错误信息正确打印了出来。这个函数的主要作用就是统计列表 self 当中有多少个元素和 v 相等。这是列表的浅拷贝函数,它只拷贝了真实 python 对象的指针,并没有拷贝真实的 python 对象 ,从下面的代码可以知道列表的拷贝是浅拷贝,当 b 对列表当中的元素进行修改时,列表 a 当中的元素也改变了。如果需要进行深拷贝可以使用 copy 模块当中的 deepcopy 函数。copy 函数对应的源代码(listcopy)如下所示:下图就是使用 a.copy() 浅拷贝的时候,内存的布局的示意图,可以看到列表指向的对象数组发生了变化,但是数组中元素指向的 python 对象并没有发生变化。下面是对列表对象进行深拷贝的时候内存的大致示意图,可以看到数组指向的 python 对象也是不一样的。当我们在使用 list.clear() 的时候会调用下面这个函数。清空列表需要注意的就是将表示列表当中元素个数的 ob_size 字段设置成 0 ,同时将列表当中所有的对象的 reference count 设置进行 -1 操作,这个操作是通过宏 Py_XDECREF 实现的,这个宏还会做另外一件事就是如果这个对象的引用计数变成 0 了,那么就会直接释放他的内存。在 python 当中如果我们想要反转类表当中的内容的话,就会使用这个函数 reverse 。其对应的免费云主机域名源程序如下所示:上面的源程序还是比较容易理解的,给 reverse_slice 传递的参数就是保存数据的数组的首尾地址,然后不断的将首尾数据进行交换(其实是交换指针指向的地址)。到此,关于“Python虚拟机中列表的实现原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!
相关推荐: vue-cli3.x配置全局scss报错怎么解决
这篇文章主要介绍“vue-cli3.x配置全局scss报错怎么解决”,在日常操作中,相信很多人在vue-cli3.x配置全局scss报错怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue-cli3.x配置全局scss报…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。