在 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
几个问题:
- a[0]的大小是28,乘以28*3=84,list a的大小是88是多少?
- 当我减去 a[1] - a[0] 的地址时,即 10914528 -10914496 = 32
当我使用函数大小时,我如何得到 28?
a
的id
是139954746492104。那a[0]
的id
怎么是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 字节。
正在回答您的问题:
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?
同上。因为两者都显示两个独立的对象。
我有下面的程序来打印列表的 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,list a的大小是88是多少?
- 当我减去 a[1] - a[0] 的地址时,即 10914528 -10914496 = 32 当我使用函数大小时,我如何得到 28?
id
是139954746492104。那a[0]
的id
怎么是10914496呢?
a
的没有任何元素的列表本身已经有一些大小,不仅仅是值。
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?
同上。因为两者都显示两个独立的对象。