问题描述
我有以下程序来打印列表的 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?
-
id
的a
是 139954746492104。那么id
的a[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?
同上。因为两者都显示两个独立的对象。
,没有任何元素的列表本身已经有一定的大小,而不仅仅是值。