4

我正在尝试使用一个简单的列表del a[0]来模仿deque.popleft(). 只是想了解delPython 是如何工作的。例如:

a = [0,1,2,3,4,5]

a在内存中的一个连续空间中。在我调用 之后del a[0],Python 会分配新空间并复制1,2,3,4,5到那里,或者它只会给出a一个新地址(与 相同a = a[1:])。

如果它分配了新空间,是否意味着del a[0]是一个 _O (len (a) _ 操作?

如果del a[0]同为a = a[1:],Python会回收数组中已经删除的内存空间吗?

4

1 回答 1

5

请参阅此答案:Python 的列表是如何实现的?

Python 列表本质上是指针数组。因此,虽然从前面删除会将整个列表中的所有元素洗牌到同一内存空间内的新位置,但如果每个元素实际存储在列表中,整个列表要比您预期的要小得多,因此洗牌就恒定的时间成本而言,速度要快得多。

但可以肯定的是,del a[0]这是一个 O(len(a)) 操作,这就是deque存在的原因。

在内存重新分配方面,有趣的是元素删除并不一定意味着元素的内存空间会立即释放。列表将在某些阈值处增加/减小大小,以提高内存分配请求的效率,并针对内存碎片进行优化。

编辑: 这篇博文更详细地解释了

澄清:之前的帖子没有说明整个列表的内存位置是一样的,但是每个元素都被打乱了,可能有一些内存被释放了。

于 2015-01-08T07:57:18.993 回答