问题 python列表是否存储对象或对象的引用?


大小 整数是24个字节 和 char的大小是38个字节, 但是当我插入列表时,列表的大小并不反映我插入的对象的确切大小。所以,现在我在漫游列表中持有对象的引用,并且对象存储在内存中的某处。

>>> sys.getsizeof(1)
24
>>> sys.getsizeof('a')
38
>>> sys.getsizeof([])
72
>>> sys.getsizeof([1])
80
>>> sys.getsizeof(['a'])
80
>>> sys.getsizeof('james') 
42
>>>

3783
2018-01-17 05:31


起源

python中的所有对象都存储为引用,因此区别是没有意义的。 - ApproachingDarknessFish
因此,引用意味着通过id(object)权限返回值,如果是这样>>> id(1)140338077434280 >>> >>> sys.getsizeof(140338077434280)24 >>> - James Sapam
你能解释一下吗? - James Sapam


答案:


Python中的所有值都是装箱的,它们不会映射到机器类型或大小。即CPython实现中的所有内容都是一个 PyObject 结构。

http://docs.python.org/2/c-api/structures.html#PyObject

所以,现在我在漫游列表中持有对象的引用,并且对象存储在内存中的某处。

列表也是包含a的PyObject 序列 对列表元素的其他PyObjects的引用。该列表分配在由Python垃圾收集器管理的Python堆上。


10
2018-01-17 05:41



谢谢,我将尝试阅读有关PyObject的更多信息。 - James Sapam
如果您对C有一定的了解,那么Python C-API的文档通常非常好: docs.python.org/2/extending/newtypes.html - Stephen Diehl
非常感谢,@ freyrs - James Sapam


python中的所有内容都存储为引用。所以你的假设是正确的。

>>> id(1)
10274744
>>> a = [1]
>>> id(a)
11037512
>>> id(a[0])
10274744
>>> sys.getsizeof(1)
24
>>> sys.getsizeof(a)
80

您会看到a [0]指向id /地址1.这表示只有对象的引用存储在列表中。


0
2018-01-17 05:35



那么,列表实际上是什么? id()的值 - James Sapam
@yopy:是的,引用ID存储在列表中 - Aswin Murugesh
小心! id不保证整数常量的s是相等的,事实上,对于大到257的整数,它们不是。 (尝试 id(257) == id(258 - 1)) - icktoofay
但id的大小是24字节>>> sys.getsizeof(140338077434280)24 >>> - James Sapam
@yopy:从某种意义上说,你似乎意味着什么是“实际”存储的 a[0]  是你无法以任何方式访问或操纵的东西。 a[0] 评估一个Python对象,这就是你可以信赖的全部内容。您无法访问或操作“指针”本身,或获取存储列表内容的实际内存地址,或类似的内容。 - BrenBarn