【问题标题】:Function within a function in pythonpython中函数内的函数
【发布时间】:2012-11-03 13:16:03
【问题描述】:

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

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

【问题讨论】:

  • 两张反对票?对我来说似乎是一个合理的问题。
  • @GraemePerrow:也许人们觉得这表明缺乏研究工作(我本人没有对这个问题投票)。

标签: python


【解决方案1】:

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

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

当您调用 f1 时,f2 将被设置。

【讨论】:

    【解决方案2】:

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

    如果您在定义f2 之后从f1 内部的某个位置调用f2,它会起作用。

    Short Description of Python Scoping Rules 很好地解释了作用域在 Python 中的工作原理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多