python列表中的内存是如何处理的?

nukf8bse  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(253)

请参阅下面的代码,如您所见,当a=[1,2]为同构类型时,第一个和第二个元素的地址相差32位,但在第二种情况下,当a=[1,'a',3]时,第一个和第二个元素的地址之间没有关系,但第一个和第三个元素之间的关系是地址相差64位。所以我想知道内存是如何处理的,索引是如何发生的,它是如何与不可散列(即可变)相联系的

>>> a=[1,2]
>>> print(id(a[0]))
4318513456
>>> print(id(a[1]))
4318513488
>>> a=[1,'a',3]
>>> print(id(a[0]))
4318513456
>>> print(id(a[1]))
4319642992
>>> print(id(a[2]))
4318513520
>>>
3b6akqbq

3b6akqbq1#

一般来说 id 没关系。别担心 id S别看我 id S事实上,这是一个cpython实现细节 id s是内存地址,因为它很方便。另一个python实现可能会做其他事情。
在任何情况下,您都会看到cpython的小整数缓存(例如,请参见此问题),其中某些整数对象被预先分配为“单例”对象,因为它们通常会被使用。然而,这也是一个实现细节。
'a' 另一方面,它不是缓存的(如果您的代码是从磁盘上的.py文件加载的,它可能已被缓存),因此它是从其他地方分配的。
至于你关于索引的问题,cpython(同样,另一个实现可能会做不同的事情)列表在后台是指向pyobjects的指针数组,所以它只是一个o(1)操作。

相关问题