在 Python 中如何为 `list` 分配内存?为什么列表的大小与其对象的总和不同?

How allocation of memory for `list` works in Python? Why size of list is not same as combined sum of its objects?

我有下面的程序来打印列表的 id 和大小及其元素。

import sys

a=[1,2,3]

print(id(a))
print(id(a[0]))
print(id(a[1]))
print(id(a[2]))

print("=================")

print(sys.getsizeof(a))
print(sys.getsizeof(a[0]))
print(sys.getsizeof(a[1]))
print(sys.getsizeof(a[2]))

打印:

139954746492104
10914496
10914528
10914560
=================
88
28
28
28

几个问题:

没有任何元素的列表本身已经有一些大小,不仅仅是值。

python 中的列表不包含对象本身。它们只是存储对对象的引用。 因此,任何索引处的对象大小与列表的大小不成比例。例如:

>>> import sys
>>> my_list = [10, "my_str", {}]


>>> sys.getsizeof(my_list[0])  # it is memory used by int
24
>>> sys.getsizeof(my_list[1])  # it is memory used by str
43
>>> sys.getsizeof(my_list[2])  # it is memory used by dict
280

>>> sys.getsizeof(my_list)  # and it is memory used by your list object itself
96

此处,my_list 的大小为 96 字节,而单独的 my_list[2] 为 280 字节。


正在回答您的问题:

The size of a[0] is 28. When I multiply 28*3=84, how size of list a is 88?

正如我上面提到的,列表只保存对对象的引用,而不是对象本身。因此,列表使用的内存和它的每个对象使用的内存不会相同。

When I subtract address of a[1] - a[0] i.e. 10914528 -10914496 = 32 How I am getting 28 when I use size of function?

a[1]a[0] 引用两个独立的对象,不保证其内存分配具有传染性。

id of a is 139954746492104. Then how id of a[0] is 10914496?

同上。因为两者都显示两个独立的对象。