说我有这样的示例代码。
def foo(n):
def bar():
return -1
if n = 0:
return 0
else:
return foo(n+bar())
我假设每次foo被递归调用时它会创建一个新的bar实例。然而,这似乎可以在python(或任何其他语言)中进行优化,但我无法找到任何说明它是否已针对此进行优化。
我在foo中定义了bar的原因是我试图隐藏用户栏和python的_bar()或__bar()“请先生不要使用这个亲爱的用户”让我很烦,因为我受过训练用非脚本语言。
答案 0 :(得分:2)
def
是Python中的可执行语句(class
也是如此)。每次调用bar
时都会创建foo()
的新函数对象,但这是非常简单的成本。它只检索已编译的代码对象,并将其包装在新的函数对象中。人们过分强调这个waaaay ;-)一般来说,为了使闭包正常工作并捕获适当的默认参数,必须这样做。你是对的,在很多情况下这个可以进行一些优化,但CPython的实现并没有打扰。