【问题标题】:How is memory handled in Python's Lists?Python 列表中的内存是如何处理的?
【发布时间】:2021-09-19 00:16:45
【问题描述】:

看下面的代码,当你看到 a=[1,2] 是一个同构类型 1st2nd 的地址> 元素相差 32 位 但是在第二种情况下 a=[1,'a',3] 时,1st2nd 元素的地址之间没有关系,但是1st3rd 元素之间存在关系,即地址相差 64 位。 所以我想知道 memory 是如何处理的,索引是如何发生的,以及它是如何与 non hashable (即可变的)相关联的

>>> 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
>>>

【问题讨论】:

  • 仅供参考 - 您忘记包含“下面的代码”
  • 使用代码块来包含代码,而不是图像。

标签: python arrays list memory hashable


【解决方案1】:

一般来说,ids 无关紧要。不要担心ids。不要看ids。其实就是CPython implementation detailids是内存地址,因为方便。另一个 Python 实现可能会做其他事情。

在任何情况下,您都会看到 CPython 的小整数缓存(参见例如this question),其中某些整数对象被预分配为“单例”对象,因为它们预计会经常使用。然而,这也是是一个实现细节。

另一方面,字符串 'a' 没有被缓存(如果您的代码是从磁盘上的 .py 文件加载的,它可能是 interned),所以它是从其他地方分配的。

至于你关于索引的问题,CPython(同样,另一个实现可能会做不同的事情)列表在底层是指向 PyObjects 的指针数组,所以它只是一个 O(1) 操作。

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 2011-05-27
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多