在python中删除包含和不包含“:”op的列表

2024-04-23 07:00:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用python已经有相当一段时间了,对于垃圾收集、内存管理以及删除变量和释放内存的实际处理方面的一些问题,我感到困惑。你知道吗

>>> pop = range(1000)
>>> p = pop[100:700]
>>> del pop[:]
>>> pop
[]
>>> p
[100.. ,200.. 300...699]

在上面的代码中,会发生这种情况。但是

>>> pop = range(1000)
>>> k = pop   
>>> del pop[:]
>>> pop 
[]
>>> k
[]

在第二种情况下,它意味着k只是指向列表“pop”。你知道吗

问题的第一部分:

但是,第一个代码块中发生了什么?包含[100:700]元素的内存是否没有被删除,或者在创建列表“p”时是否重复?你知道吗

问题的第二部分:

另外,我也试过包括gc.启用以及gc.收集语句,但这两个代码的内存利用率没有变化。这有点令人费解。python没有将空闲内存返回到操作系统,这不是很糟糕吗?如果我做的小调查有错,请纠正我。提前谢谢。你知道吗


Tags: 内存代码元素列表情况range语句利用率
2条回答

对一个序列进行切片会产生一个新的序列,其中包含适当元素的浅拷贝。你知道吗

将内存返回到OS可能是不好的,因为脚本可能会返回并创建新对象,此时Python必须再次从OS请求内存。你知道吗

第一部分:

在第一个代码块中,创建一个新对象,在删除旧对象之前,将在其中复制旧对象的元素。你知道吗

但是,在第二个代码块中,只需将同一对象的引用指定给另一个变量。然后清空列表,当然,这两个引用都可以看到。你知道吗

第二部分:适当的时候会返回内存,但并不总是这样。在Python的框架下,有一个内存分配器,可以控制内存的来源。有两种方法:通过brk()/sbrk()机制(对于较小的内存块)和通过mmap()(较大的块)。你知道吗

在这里,我们有更小的块,直接分配到数据段的末尾:

datadatadata object1object1 object2object2

如果我们只释放object1,我们就有了一个内存缺口,这个缺口可以重新用于下一个对象,但是不能轻易地释放并返回到操作系统。你知道吗

如果我们释放这两个对象,内存就可以返回。但可能有一个门槛可以让记忆保留一段时间,因为立即返回所有内容并不是最好的事情。你知道吗

相关问题 更多 >