Python 释放数组中项目的内存

Python 释放数组中项目的内存,python,arrays,memory-management,Python,Arrays,Memory Management,我知道del和gc模块,但我想知道在循环数组时是否可以释放数组中的内存;不要与释放阵列本身的内存混淆。我想在打印后释放数组中项目的内存。以下是我试图实现的一个人为的例子: array = ['foo', 'bar', 'foobar'] for item in array: print item del item 这会释放项目foo、bar和foobar的内存吗?释放列表中项目使用的内存的方法是删除列表位置(例如del array[1])或向其中分配其他内容(例如array[1]=No

我知道
del
gc
模块,但我想知道在循环数组时是否可以释放数组中的内存;不要与释放阵列本身的内存混淆。我想在打印后释放数组中项目的内存。以下是我试图实现的一个人为的例子:

array = ['foo', 'bar', 'foobar']
for item in array:
  print item
  del item

这会释放项目
foo
bar
foobar
的内存吗?

释放列表中项目使用的内存的方法是删除列表位置(例如
del array[1]
)或向其中分配其他内容(例如
array[1]=None
)。如果您不关心列表本身使用的内存是否被回收,那么第二个会更快,因为它不需要移动任何内存

在这两种情况下,只要没有对该对象的其他引用,那么它的内存就会被释放。因此:

array = ['foo', 'bar', 'foobar']
for index, item in enumerate(array):
    print item
    array[index] = None

# at the end of the loop, `item` still points to the final item
# so you might want to do the same to make sure it gets released
item = None

不,你可以自己检查

您的代码:

array = ['foo', 'bar', 'foobar']
for item in array:
    del item
print array # ['foo', 'bar', 'foobar'] 
数组中删除一个元素

array = ['foo', 'bar', 'foobar']
del array[1]
print array # ['foo', 'foobar']
array = ['foo', 'bar', 'foobar']
del array[:]
print array # []
数组中删除所有内容

array = ['foo', 'bar', 'foobar']
del array[1]
print array # ['foo', 'foobar']
array = ['foo', 'bar', 'foobar']
del array[:]
print array # []
注意:
'foo'
当有另一个引用时,它将不会被垃圾收集(即内存不会被释放):

array = ['foo', 'bar', 'foobar']
x = array[0]
del array[:]
print array # []
print x # foo

不要在使用
for
循环遍历列表时尝试修改列表,请尝试以下操作:

array = ['foo', 'bar', 'foobar']
while array:
    item = array.pop()
这将在您遍历数组时从数组中删除这些项,从而允许对它们进行垃圾收集。但是,这将导致您按相反的顺序浏览列表。如果这是一个问题,那么首先使用
array.reverse()


您不想使用
数组。pop(0)
-尽管这允许您以正常顺序遍历数组,但它比从末尾弹出要慢几个数量级。当列表非常小时,情况就不是这样了,但如果是这样的话,您可能一开始就不会担心内存使用。

没有什么可发布的<代码>项将在每次迭代时引用列表中的下一项。除非我误解了,你想在每次迭代时删除原始
数组中的项目?所以基本上你想对每个项目做些什么,然后将其从列表中删除?在每次迭代结束时删除项目的内存。我的全部假设是foo bar和foobar将在内存中保留自己的空间将从列表中“删除”它释放内存?如果你试图以这种方式与语言对抗,你一定非常需要内存。如果您是内存关键型的,那么不要使用python,使用C。但我敢打赌,在您的代码中有数百个更好的地方可以保护一些内存。请注意,python中缓存了小字符串,因此这只会释放与一个引用计数相关的内存。而字符串文本是内部的,不会被释放,但我假设这只是一个例子,我想把这个例子应用到数组中,数组中存储了一些对象。谢谢你,我相信这就是我想要删除列表位置(
del array[index]
)的原因,而你在遍历它的时候,这是一个坏主意。。。当然也有办法解决这个问题,但无论如何,这就是为什么我选择了更直接的方法。是的,但是垃圾收集什么时候发生?循环完成后。我需要在每次发布后发布iteration@200OK我相信
array.pop(0)
所花的时间比从末尾开始要长得多。@Joaq2Remember您可以在循环的每个迭代中添加
delitem
。我的主要观点是,在遍历列表(
for
loop)时修改列表往往是个坏主意。