我知道del
和gc
模块,但我想知道你是否可以在循环时释放数组内的内存;不要混淆释放数组本身的内存。我想在打印后释放数组中项目的内存。这是我想要完成的一个人为的例子:
array = ['foo', 'bar', 'foobar']
for item in array:
print item
del item
这会释放项目foo
,bar
和foobar
的内存吗?
答案 0 :(得分:1)
释放列表中项目使用的内存的方法是删除列表位置(例如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
答案 1 :(得分:1)
不,你可以自己检查一下。
您的代码:
array = ['foo', 'bar', 'foobar']
for item in array:
del item
print array # ['foo', 'bar', 'foobar']
从array
删除一个元素:
array = ['foo', 'bar', 'foobar']
del array[1]
print array # ['foo', 'foobar']
删除array
:
array = ['foo', 'bar', 'foobar']
del array[:]
print array # []
注意:强>
'foo'
不将被垃圾收集(即内存不会被释放),当有另一个引用它时:
array = ['foo', 'bar', 'foobar']
x = array[0]
del array[:]
print array # []
print x # foo
答案 2 :(得分:0)
不是在您使用for
循环迭代它时尝试修改列表,请尝试以下操作:
array = ['foo', 'bar', 'foobar']
while array:
item = array.pop()
这将在你通过它时删除数组中的项目,允许它们被垃圾收集。但是,这将导致您以相反的顺序浏览列表。如果这是一个问题,请先使用array.reverse()
。
您不想要使用array.pop(0)
- 尽管这允许您按正常顺序浏览数组,但它比从末尾弹出要慢几个数量级。当列表非常小时,这不是真的,但如果是这种情况,你可能不会首先担心内存使用。