在Python中,“list”的内存分配是如何工作的?为什么列表的大小和对象的总和不同?
我有下面的程序来打印列表及其元素的在Python中,“list”的内存分配是如何工作的?为什么列表的大小和对象的总和不同?,python,python-3.x,data-structures,memory-management,Python,Python 3.x,Data Structures,Memory Management,我有下面的程序来打印列表及其元素的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]))
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
几个问题:
- [0]的大小为28。当我乘以28*3=84时,列表a的大小是88
- 当我减去a[1]-a[0]的地址时,即10914528-10914496=32 当我使用函数的大小时,我是如何得到28的
的a
是139954746492104。那么id
的a[0]
是10914496吗id
- 没有任何元素的列表本身已经有了一定的大小,不仅仅是值。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字节
回答您的问题: [0]的大小为28。当我乘以28*3=84时,列表a的大小是88 正如我前面提到的,列表只保存对对象的引用,而不是对象本身。因此,列表使用的内存和它的每个对象使用的内存并不相同 当我减去[1]-a[0]的地址,即10914528-10914496=32时,当我使用函数的大小时,如何得到28
a[1]
和a[0]
指的是两个独立的对象,它们的内存分配不保证会传染
a的id是139954746492104。那么[0]的id是10914496吗
同上。因为两者都显示两个独立的对象。如果[0]、a[1]和a[2]不能保证是一致的,那么a应该存储a[0]或a[1]或a[2]的地址,或者a应该只存储[0]的地址?