【问题标题】:Python basic nested statements and scope conceptPython基本嵌套语句和范围概念
【发布时间】:2017-03-07 14:46:49
【问题描述】:
def func():
    def nested():
        global x
        x = 1
x = 2
func()
print(x)

正确答案是“2”,原因是 func() 没有定义。但是当我读到这个时,似乎 func() 被定义为nested()。我认为当你调用 func() 时,它会自动调用nested()。我正在努力掌握这一点并理解为什么我不应该那样阅读它。

【问题讨论】:

  • nested 被创建但未被调用。

标签: python scope nested-function


【解决方案1】:

您在func 中定义nested,但您没有在func 中的任何地方调用nested(),所以当您调用func() 时它实际上什么都不做。

要做你想做的尝试将func定义为:

def func():
    def nested():
        global x
        x = 1
    nested()

更新:在 StevenRumbalski 发表评论之后,我认为关于该函数中究竟发生了什么的一个小补充可以帮助澄清周围的事情。

Python 的函数本身就是可以响应运算符() 的对象。 当你定义一个新函数时,你实际上在做的是实例化一个函数对象并给它一个名字。在上面的示例中,def func() 创建了一个函数实例并将其命名为 func,因此当您将运算符 () 应用于 func 时(即当您使用 func() 调用函数时)与该名称关联的函数的代码被执行。

现在让我们更进一步,看看nested 会发生什么。 嵌套定义在func 的范围内,因此当您退出func 的范围时嵌套的名称 不再定义。 但是,如果您将函数对象返回func 的调用者,则可以使用该对象来运行nested 的代码。

一个小例子:

def returning_func():
    def nested():
        print("I am nested!")
    return nested # note the lack of the () operator!

在这种情况下,如果我们这样做

my_reference_to_nested = func()

什么都没有被打印出来,因为嵌套被定义但没有被执行。 但是,如果我们称之为:

my_reference_to_nested()

我们执行嵌套的代码并打印到输出I am nested!

【讨论】:

  • 我明白了!所以 func() 定义了 nested() 但实际上并没有调用它。这就说得通了!非常感谢!
  • 很高兴它清理了一切;)如果这对您有用,请确保接受答案,以便将其标记为已解决 :)
  • return nested 然后将func 称为func()()。或者然后将func 称为inner_func = func() 然后inner_func() 其中inner_func 最终成为nested 的别名。
  • @StevenRumbalski o_O
  • @StevenRumbalski 我认为这可能会让不熟悉 python 的对象函数的人感到有些困惑。也许我可以扩大我的答案......
猜你喜欢
  • 2019-08-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
相关资源
最近更新 更多