Python局部函数及用法详解(含nonlocal关键字)
本文深入解析Python中在函数内部定义局部函数的机制,阐述其默认作用域限制及通过返回值扩大作用域的方法。重点讲解局部函数与外层函数变量同名时的“遮蔽”问题,并演示如何利用nonlocal关键字解决UnboundLocalError,实现对外层局部变量的修改。
Python局部函数及用法
在前面的学习中,我们已经了解到Python函数内部可以定义变量,从而形成局部变量。有读者可能会产生疑问:Python函数内部是否允许定义函数?答案是肯定的。Python语言支持在函数内部定义函数,这类函数通常被称为局部函数(Local Function)。
那么,局部函数具备哪些特征,在实际使用时又有哪些注意事项?接下来,我们将详细介绍Python局部函数的具体用法。
首先,与局部变量类似,默认情况下,局部函数只能在其所在函数的作用域内被调用。以下是一个简单的示例:
#全局函数
def outdef ():
#局部函数
def indef():
print("http://www.csdn.net/python/")
#调用局部函数
indef()
#调用全局函数
outdef()程序执行结果为:
http://www.csdn.net/python/
正如全局函数可以通过返回其局部变量来扩大该变量的作用域一样,如果将局部函数作为所在函数的返回值,也可以扩大局部函数的使用范围。例如,对上述程序进行如下修改:
#全局函数
def outdef ():
#局部函数
def indef():
print("调用局部函数")
#调用局部函数
return indef
#调用全局函数
new_indef = outdef()
调用全局函数中的局部函数
new_indef()程序执行结果为:
调用局部函数
因此,关于局部函数的作用域,可以总结为:如果所在函数没有返回该局部函数,则局部函数的可用范围仅限于所在函数内部;反之,如果所在函数将局部函数作为返回值,则局部函数的作用域就会扩大,既可以在所在函数内部使用,也可以在所在函数的作用域(即全局范围)中使用。
以上面程序中的outdef()和indef()为例,如果outdef()不将indef作为返回值,则indef()只能在outdef()函数内部使用;反之,则indef()函数既可以在outdef()函数内部使用,也可以在outdef()函数的作用域,也就是全局范围内使用。
另外值得一提的是,如果局部函数中定义了与所在函数中变量同名的变量,也会发生“遮蔽”(Shadowing)的问题。例如:
#全局函数
def outdef ():
name = "所在函数中定义的 name 变量"
#局部函数
def indef():
print(name)
name = "局部函数中定义的 name 变量"
indef()
#调用全局函数
outdef()执行此程序,Python解释器会报如下错误:
UnboundLocalError: local variable 'name' referenced before assignment
此错误直译过来的意思是“局部变量name还没定义就使用”。导致该错误的原因在于,局部函数indef()中定义的name变量遮蔽了所在函数outdef()中定义的name变量。再加上,indef()函数中name变量的定义位于print()输出语句之后,导致print(name)语句在执行时找不到已定义的name变量,因此程序报错。
由于这里的name变量也是局部变量,因此前面章节讲解的globals()函数或者globals关键字,并不适用于解决此问题。这里可以使用Python提供的nonlocal关键字。
例如,修改上面程序为:
#全局函数
def outdef ():
name = "所在函数中定义的 name 变量"
#局部函数
def indef():
nonlocal name
print(name)
#修改name变量的值
name = "局部函数中定义的 name 变量"
indef()
#调用全局函数
outdef()程序执行结果为:
所在函数中定义的 name 变量
到此这篇关于Python局部函数及用法(含nonlocal关键字)的文章就介绍到这了,更多相关Python局部函数内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













