我正在通过Python教程学习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#”等其他编程语言中的“辅助方法”一样工作?它们是私有方法吗?
答案 0 :(得分:2)
可以在任何地方定义功能。它们不需要在类中定义,也可以在其他函数中定义;在这种情况下,通常称为嵌套函数。
您无法从scope_test()
函数外部访问嵌套函数;它们是局部变量。该限制适用于函数中的所有局部变量。例如,spam
中定义的scope_test
名称也无法在函数外部访问。它们仅在函数局部范围内存在。
该函数可以通过返回函数使它们可用。 Python函数是第一类对象,因此您可以像其他值一样传递它们,您可以为它们指定其他名称,或者您可以只返回它们。
如果你愿意,你可以称他们为辅助功能;在Python中,如果要使用嵌套作用域,则通常嵌套函数,引用父作用域中定义的变量。装饰器通常使用它(定义包装函数的配置),事件处理程序也是如此。