在Python中,如果递归调用后不使用变量,递归函数中的变量内存会被释放吗?

joh*_*ith 5 python recursion

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

rw = 100
for r in range(rw):
    neighs = retrieve_neighs(r)
    # rest of body
Run Code Online (Sandbox Code Playgroud)

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

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

我希望retrieve_neighs 返回点列表(或某些集合) - 这开启了可以加载整个数据文件的可能性,对吗?有没有认识到嘶嘶声之后不使用

foo(r + 1)
Run Code Online (Sandbox Code Playgroud)

那么嘶嘶声所指的内存被释放了?

lvc*_*lvc 5

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