0

我正在通过 The Python Tutorial 学习 Python,我目前正在上课(第 9 章),但是在解释“范围和命名空间”时,我遇到了一个问题。

作者举了一个例子:

def scope_test():
    def do_local():
        spam = "local spam"
    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"
    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)

来源:http ://docs.python.org/3.3/tutorial/classes.html#scopes-and-namespaces-example

据我所知,关键字def是用来定义函数的,函数是放在类​​里面的,但是这种情况下他在一个函数里面定义了一个函数,那么这个函数里面的另一个函数叫什么呢?

有没有办法可以从第一个函数的外部访问它?例如,来自包含 scope_test 的命名空间。

当它们是私有方法时,函数内部的这个函数是否会像其他编程语言(如 Java 和 C#)中调用的“辅助方法”一样工作?

4

1 回答 1

2

函数可以在任何地方定义。它们不需要在类中定义,也可以在其他函数中定义;在这种情况下,它们通常被称为嵌套函数

您不能从函数外部访问嵌套scope_test()函数;它们是局部变量。该限制适用于函数中的所有局部变量。例如,spam内部定义的名称在函数外部也scope_test无法访问。它们仅在函数本地范围内存在。

该函数可以通过返回该函数使它们可用。Python 函数是一流的对象,因此您可以像传递其他值一样传递它们,可以为它们分配其他名称,或者您可以只返回它们。

如果你愿意,你可以称它们为辅助函数;在 Python 中,如果要使用嵌套作用域,通常会嵌套函数,指的是在父作用域中定义的变量。装饰器经常利用这一点(定义包装函数的配置),事件处理程序也是如此。

于 2013-05-03T11:59:22.673 回答