求教一个python 3.x 中关于nonlocal变量的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求教一个python 3.x 中关于nonlocal变量的问题相关的知识,希望对你有一定的参考价值。
代码如下:
def tester(start):
state=start
def nested(label):
nonlocal state
state+=1
print(label,state)
return nested
f=tester(0)
f('spam')
f('bam')
————————————————
最后两行连续两次调用函数,为什么第一次输出spam 1,第二次输出bam 0?
既然f=tester(0),那么不管f('spam')还是f('bam'),不是都等同于tester(0)(‘spam’)和tester(0)(‘bam’)吗?
理应两次输出都是 spam 0 和 bam 0吧?
求讲解其中机制
spam 1
bam 2
执行过程:
1、f=tester(0),调用tester,用0初始化tester的state,将内部函数nested返回并赋值给f
2、f('spam'),调用f,即直接调用内部函数nested,传入参数spam。由于nonlocal state,实际上操作的是tester的state,上面初始化过state是0,所以加1,结果是spam 1
3、f('bam'),再次调用f,上次执行后state变成1,这次再次加1,变成2,结果bam 2追问
对 就应该是这样,但是这里:
f('spam'),调用f,即直接调用内部函数nested,为什么是直接调用?
前面不是已经让 f=tester(0) 了吗?
按理说f('spam'),就应该跟tester(0) (‘spam’)一样啊
tester(0)的返回值是return nested,所以f收到的只是nested的调用地址。再次调用f,实际是调用了nested。
看一下下面的代码,对理解可能有帮助。
def function():print('Hello')
f = function
g = f
g()本回答被提问者和网友采纳 参考技术B 本体考察『Python的闭包』相关知识点。
所谓闭包,就是『高级的封装』,可以在局部保存内部变量所在环境的信息。
这里,两次调用f,信息累加。故state:0->1->2
以上是关于求教一个python 3.x 中关于nonlocal变量的问题的主要内容,如果未能解决你的问题,请参考以下文章
求教大神,java中关于String类的getBytes()方法的问题