在递归函数内定义内部函数是个坏主意吗?

9 投票
2 回答
1025 浏览
提问于 2025-04-18 03:09

我有一些递归回溯的代码,它会在做出选择之前先检查这个选择是否合法。把 is_legal_choice 这个函数放在递归的 solve 函数里面,这样做是不是不好?每次调用 solve 函数的时候,这个内部的函数会被重新定义吗?

2 个回答

1

是的,每次调用的时候它都会被重新定义。不过,这并不总是坏事。这其实是创建闭包的一种方式,而闭包有时候是很有用的。

如果你的 is_legal_choice 函数需要使用一些只在外部函数范围内的数据,那我觉得这样做没问题。性能上的影响不会太大(如果需要的话,你可以随时进行性能测试)。

如果 is_legal_choice 不需要使用 solve 函数的参数数据,那就按照最能让你的代码易于理解的方式来做吧。

你可以在网上搜索更多关于闭包的信息,这里有个例子: http://ynniv.com/blog/2007/08/closures-in-python.html

6

是的,每次调用这个函数的时候,里面的那个小函数都会被重新定义。不过,这并没有你想象的那么糟糕;其实,Python 代码只会被解析成一个代码对象一次,而每次调用的时候,只有这个函数对象(可以理解为包裹代码对象的一个外壳)会被重新创建。

撰写回答