我正在尝试使用del a[0]
的简单列表来模仿deque.popleft()
。只是想了解python中的del
是如何工作的。例如:
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会回收已从数组中删除的内存空间吗?
答案 0 :(得分:5)
请参阅此答案:How is Python's List Implemented?
Python列表本质上是指针数组。因此,虽然从前面删除将整个列表中的所有元素混合到同一存储空间内的新位置,但是如果每个元素实际存储在列表中,则整个列表比您期望的要小得多,因此就不变的时间成本而言,洗牌要快得多。
但可以肯定的是,del a[0]
是一个O(len(a))操作,这就是deque
存在的原因。
就内存重新分配而言,有趣的是,元素删除并不一定意味着元素的内存空间立即被释放。列表将在特定阈值处增加/减小大小,以使内存分配请求更有效,并优化内存碎片。
修改: This blog post explains in more details
澄清:以前帖子没有解释整个列表的内存位置是相同的,但每个元素都被洗牌,可能某些内存被释放。< / p>