【问题标题】:Error in defining a function that defines another function [duplicate]定义定义另一个函数的函数时出错[重复]
【发布时间】:2020-11-29 12:38:21
【问题描述】:

(注意:-您可以滚动到粗体部分以获取主要信息。)
感谢您花时间回答我的问题。我在使用以下代码定义另一个函数的函数时遇到 python-3 错误

def one():
    def two():
        print("two()")
one()
two()

还有错误:

Traceback (most recent call last):
  File "C:\Users\homec\AppData\Local\Programs\Python\Python39\test.py", line 60, in <module>
    two()
NameError: name 'two' is not defined

在定义one()之后,我调用了one(),所以我定义了two()。然后我打电话给two(),所以我打印了"two()"。那么这里有什么问题,为什么是name 'two' is not defined
提前感谢您的回答。

【问题讨论】:

  • 提示:定义范围
  • @tibebes 请给出答案而不是提示。
  • 通常不需要嵌套函数。 two() 仅在 one() 内可用
  • @maurice 好的,谢谢,但您应该扩展并保留它作为另一个答案(为了您的声誉)。

标签: python python-3.x function nameerror


【解决方案1】:

函数two 只是在外部/全局范围内不可用。

请参阅此示例了解如何在全局范围内定义它:

In [7]: def one():
    ...:     global two
    ...:     def two():
    ...:         print("two()")
    ...: one()
    ...: two()
two()

【讨论】:

  • 哇,我从来没有想过像这个人这样的工作。如果我们想定义一个函数但又不想给它任何其他别名,这很好。
  • 如果您不想要另一个别名,您可以只为变量提供与内部函数相同的名称,而不是 x 或 func。 @Navaneeth Reddy
  • @JLeno46 如果我正在制作具有复杂功能的装饰器,我会这样做。但老实说,这段代码很天才。
  • 为什么不把global two放在def之前呢?像这样使用globals() 是一种丑陋且不必要的黑客攻击。
  • @Tibebes.M 不客气。但是,我不会将其称为“解决方法/黑客”。您更新后的答案使用 global 的方式与设计完全一致。
【解决方案2】:

您在函数one 中定义了函数two,甚至没有返回它。即使您返回它,您也必须将返回值存储在某个变量中,然后将该变量作为函数调用。试试这个代码:

def one():
    def two():
        print("Two")
    return two

func = one()
func() #outputs 'Two'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2015-01-16
    • 2014-06-07
    • 1970-01-01
    • 2017-03-19
    • 2013-05-14
    相关资源
    最近更新 更多