在Python中,如果在递归调用之后它们没有被使用,那么递归函数中的变量的内存是否会被释放?

时间:2014-12-27 04:44:55

标签: python recursion

下面是一些迭代编写的代码,与DBSCAN算法有轻微的相似之处:

rw = 100
for r in range(rw):
    neighs = retrieve_neighs(r)
    # rest of body

如果我使用递归重写它,我可能会写:

rw = 100
def foo(r):
    if r < rw:
        neighs = retrieve_neighs(r)
        # rest of body
        foo(r + 1)
foo(0)

我希望retrieve_neighs返回一个列表(或一些集合) - 这样就可以加载整个数据文件,对吗?

之后是否认识到没有使用嘶声?
foo(r + 1)

所以内存嘶声指的是被释放?

1 个答案:

答案 0 :(得分:3)

你所描述的是尾部调用优化的一个主要影响,Python明确没有这样做,因为Guido认为它isn't worth the tradeoffs,特别是在调试信息方面。如果算法的递归版本更清楚,您可能会考虑在不再需要它时明确地执行del neighs - 这具有保存效果,因为变量超出范围,可能使其符合垃圾回收的条件。