2012-11-03 45 views
2

我最近遇到了在Python中用函数定义函数的想法。我有这样的代码,它提供了错误:Python中的函数内的函数


def f1(a): 
    def f2(x): 
     return a+x 
    return 2*a 

错误:在调用f2(5)

Traceback (most recent call last): 
File "<pyshell#19>", line 1, in <module> 
f2(5) 
NameError: name 'f2' is not defined 

我有一些困难,了解全局变量在函数中使用的方法甚至在递归调用中。如果有人会指出我的错误,并且可能会帮助我,我会很感激。提前致谢 !!

+0

两个downvotes?对我来说这似乎是一个合法的问题。 –

+0

@GraemePerrow:也许人们觉得这表明缺乏研究工作(我自己并没有就此问题投票)。 –

回答

5

您在本地命名空间中定义了f2f1只有;它不是全球可用的。

如果你想这样的嵌套函数可用在模块级,你就必须要么从函数返回,或者定义一个变量global将其存储在:

def f1(a): 
    def f2(x): 
     return a+x 
    return 2*a, f2 

然后调用那如result, f2 = f1(somevariable_or_literal)

global的做法是不推荐(使用global很少是),但看起来是这样的:

f2 = None 

def f1(a): 
    global f2 
    def f2_local(x): 
     return a+x 
    f2 = f2_local 
    return 2*a 

此时当你叫f1f2将被设置。

4

f2f1内定义。因此,它的范围仅在功能f1内部扩展。在该空间之外,功能f2甚至不存在,这就是为什么你会收到错误。

如果您在f2被定义后从f1内部的某个地方拨打f2,它就会起作用。

Short Description of Python Scoping Rules对于范围在Python中的工作原理有很好的解释。