Python列表我不知道为什么差16

时间:2019-03-15 10:20:40

标签: python

>>> import sys
>>> print(sys.getsizeof(int()))
12
>>> print(sys.getsizeof(str()))
25
>>> mylist = [1,2,3,4,5,'ab']
>>> print(id(mylist))
50204144
>>> print(id(mylist[0]))
1849873456
>>> print(id(mylist[1]))
1849873472
>>> print(id(mylist[2]))
1849873488
>>> print(id(mylist[3]))
1849873504
>>> print(id(mylist[4]))
1849873520
>>> print(id(mylist[5]))
50209152

我不知道为什么差16:

64位操作系统

2 个答案:

答案 0 :(得分:0)

因为它们在列表内 int ,所以整数在内存中的位置在 16到16 位,所以我真的建议您看一下这篇文章:What is the id( ) function used for?

答案 1 :(得分:0)

您的问题似乎是:如果sys.getsizeof(int())是12,那么为什么其中的id()值中的某些则相隔16个字节而不是12个字节?

您似乎期望新分配的int彼此相距12个字节,因为int占用12个字节的存储空间。

如果您期望如此,那是因为您期望Python列表像一个C数组,这是一块连续的内存,其中五个8字节对象的数组恰好占用40个字节。但是Python列表不是数组,列表元素不一定按升序分配(更不用说打包在一起了)。因此,您无法期望id()的值可以从对象占用的内存量中预测出来。

如果您确实感兴趣,那么一定要了解Python数据结构的分配方式。但这是一个非常高级的主题,因此CPython核心团队以外的人很少需要考虑它。我们其余的人只是满意而已。这就是为什么您收到诸如这是一个实施细节您为什么在乎?

之类的注释的原因。

重要的是要知道C数组的分配方式,因为在C中,您直接操作内存指针,而出错将导致灾难性的后果。但是Python负责为您分配内存,因此了解其工作方式的所有细节都不太可能使您成为更好的Python程序员。