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

问题描述

我有以下程序来打印列表的 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

几个问题

  • a[0] 的大小是 28。当我乘以 28*3=84 时,列表 a 的大小是 88?
  • 当我减去 a[1] - a[0] 的地址时,即 10914528 -10914496 = 32 使用函数大小时如何得到 28?
  • ida 是 139954746492104。那么 ida[0] 是 10914496 吗?

解决方法

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 字节。


回答您的问题:

a[0] 的大小是 28。当我乘以 28*3=84 时,列表 a 的大小是 88?

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

当我减去 a[1] - a[0] 的地址时,即 10914528 -10914496 = 32 当我使用函数大小时我如何得到 28?

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

a 的 id 是 139954746492104。那么 a[0] 的 id 是 10914496?

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

,

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