1、现状
在学习Python中,刚开始接触闭包时,难免不好理解,现以给“金瓶梅”加书名号为例,分解过程,进行说明。
2、代码区
话不多说,直接上代码:
def funcOut(func):
def funcIn():
return "《" + func() + "》"
return funcIn
def bookName():
return '金瓶梅'
bookName = funcOut(bookName)
print(bookName())
3、过程分析
简单来讲, 该代码区分为4各部分:
1-定义一个闭包;
2-定义bookName函数;
3-给bookName赋值;
4-打印bookName()
一、首先运行的是3
-
即给bookName赋值,其中,funcOut(bookName)指的是调用函数funcOut,并传入参数bookName,可以看出,函数funcOut最终返回了函数funcIn,即它的内部函数,因此,函数bookName就等同于函数funcIn!!我们可以测试一下:
在上面这个图,我们增加了打印两个id号,分别是闭包中的内部函数funcIn和函数bookName,可以在操作台中看出,两个id号一模一样,因此,在经过了给bookName赋值这一步,函数bookName就等同于函数funcIn了 !这个的理解非常重要!继续分析,参照下图,由于此时bookName作为参数传给func,并且内部函数又对func进行了调用,即对bookName进行了调用,因此调用了第7行代码的bookName,返回了字符串“金瓶梅”,因此此时的内部函数的返回值就是《金瓶梅》
- 最后执行了的是第12行代码,即打印对bookName调用的结果,也就是打印bookName的返回值,因为我们在第10行对bookName函数进行了重新的赋值,因此,不会再执行第7行代码,而是执行刚刚赋值过的bookName,即闭包的内部函数funcIn,而此时其返回值为《金瓶梅》,因此最终操作台的结果就是:《金瓶梅》
以上为个人理解,理解方式或有多种多样,欢迎讨论!