微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么相同对象的内存空间分配不同?

如何解决为什么相同对象的内存空间分配不同?

我正在试验 Python 如何分配内存,所以发现了类似的问题 Size of list in memory 和 Eli 的描述要好得多。他的回答让我产生了新的疑问,我检查了 1 + [] and [1] 的大小,但正如您在代码片段中看到的那样,它是不同的。如果我没记错内存空间分配应该是一样的。但事实并非如此。任何人都可以帮助我理解吗?

>>> import sys
>>> sys.getsizeof(1)
    28
>>> sys.getsizeof([])
    64
>>> 28 + 64
    92
>>> sys.getsizeof([1])
    72

解决方法

列表运行所需的最少信息是什么?

  1. 某种顶级列表对象,包含对类信息(方法、类型信息等)的引用,以及列表自己的实例数据
  2. 存储在列表中的实际对象

...这让你得到你期望的大小。但是够了吗?

一个固定大小的列表对象只能跟踪固定数量的列表条目:传统上只有一个(头)或两个(头和尾)。 向列表中添加更多条目并不会改变列表对象本身的大小,因此必须有一些额外的信息:列表元素之间的关系。

可以将这些信息存储在每个对象中(这称为侵入式列表),但它的限制性很强:每个对象一次只能存储在一个列表中。

由于 Python 列表显然不是那样的,我们知道这个额外的信息并不存在于列表元素中,也不能在列表对象中,所以它必须存储在其他地方。这会增加列表的总大小。

注意。我故意使这个论点相当抽象。您可以通过几种不同的方式实现列表,但它们都不能避免元素关系的一些额外存储,即使表示不同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。