Python列表在内存中的存储方式

前面我们说过,a=100,然后可以直接把a的内存地址,直接给b,再直接给c,这三个变量都是对100的直接引用,我们画个图看看。它们都指向了内存地址100。

而列表,我们上一章讲过是间接引用,我们看看列表,l=[‘a’,’b’,’c’]在内存是怎么进行存储的。

如图所示,列表不会存放真正的值,它只会存放索引和值的内存地址,而只会存放单独的内存空间。最后就是给这个列表绑定了一个变量名l,所以我再取l[0]的时候,是先拿到0号索引,然后找到值‘a’的内存地址,最后把值拿到。

假如我给上面的列表再增加一个值,l=[‘a’,’b’,’c’,a],注意这个a没有添加引号,说明我写了一个变量名在这里,然后就相当于把a指向的内存地址,也就是100放在这里了。

现在你就应该明白,为什么叫间接引用。你也可以理解为列表里就是村里一堆目录,索引对应身份证号,然后我们可以通过目录里的身份证号引用到值。

说到这里,你也应该明白了字典的储存方式,列表存到是索引对应值的内存地址,那字典自然而然存的key对应值的内存地址这就没什么可说的了。

现在我们看看100这个引用计数是多少,首先被a、b、c这三个变量名,各自引用了一次,然后被列表l引用了一次,现在我可以这样说只要能访问到这个支的方式都叫一种引用。所以此时,100这个值的引用计数就为4。

当一个值引用计数为0的时候,就会被垃圾回收机制回收,也可以这样说,不能通过变量名直接引用,也不能通过列表或者字典这种容器类型简接引用的内存空间就会被垃圾回收机制回收。

至于垃圾回收机制底层是怎么运行的,这就涉及到三个概念,一个就是引用计数,另一个是标记清除,还有一个叫分代回收。另外两个概念我们后面再讲。

未经允许不得转载:445IT之家 » Python列表在内存中的存储方式

赞 (0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏