Python 基本的嵌套语句和作用域概念

Python basic nested statements and scope concept

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

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

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

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

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

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

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

现在让我们更进一步,看看 nested 会发生什么。 Nested 是在 func 的作用域 中定义的,因此当您退出 func 的作用域时 名称 nested 不再定义。 但是,如果您 return 将函数对象 传递给 func 的调用者,则可以将该对象用于 运行 nested' s码.

一个小例子:

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

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

my_reference_to_nested = func()

没有打印任何内容,因为 nested 已定义但未执行。 但是,如果我们调用它:

my_reference_to_nested()

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