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

标签 python scope nested-function

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

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

最佳答案

您正在定义 nested里面func , 但你没有调用 nested() func 中的任意位置, 所以当你调用 func()它实际上什么都不做。

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

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

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

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

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

一个小例子:

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()

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

关于Python 基本嵌套语句和作用域概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42651232/

相关文章:

python - Sprintf MATLAB 和 Python

angular - Typescript 变量在内部函数内未定义

ruby-on-rails - rails 范围返回一条记录

jquery - 回调函数和嵌套函数一样吗?

javascript - 事件处理问题

python - 如果重复列值在另一列中具有相同的值,则只保留第一次出现的重复列值

python - Selenium + Python 期望特定的已找到元素

python - 打包 numpy 数组的更好方法?

c - 在 C 中第二次调用同一打印函数时出现错误

python - 嵌套函数中的局部变量