12

我最近遇到了在 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

我很难理解全局变量在函数之间甚至在递归调用中的使用方式。如果有人能指出我的错误并在此过程中帮助我,我将不胜感激。谢谢!!

4

2 回答 2

11

f2在本地命名空间中定义了f1 only ; 它在全球范围内不可用。

如果您希望这样的嵌套函数在模块级别可用,则必须从函数中返回它,或者定义一个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

f2您调用f1.

于 2012-11-03T13:19:19.097 回答
6

f2在里面定义f1。因此,它的作用域只在函数内部扩展f1。在该空间之外,该功能f2甚至不存在,这就是您收到错误的原因。

如果你在定义之后f2从内部的某个地方调用,它会起作用。f1f2

Python 作用域规则的简短描述很好地解释了作用域在 Python 中的工作原理。

于 2012-11-03T13:18:28.510 回答