引子
博主目前就读于河北某一所软件学校,虽然已经有过一段时间的学习,但是在总体上来说,依旧是一位初学者
恰巧学校要对我们进行分层(个人还是比较支持这种行为的,因为确实很多人不学的话。对班级的风气影响颇大),以考试+面试的结果分成2个班。
所以,自认为学的不错的博主,怀揣着想去小班的梦想就踏入了考场(占用了我们为数不多的假期😭😭)
因为之前就有了解到是笔试,虽然博主已很长时间没有碰过笔了,但是自认为学的还不错的博主感觉丝毫不慌
结果拿到卷子的博主当场傻眼,题不是很难,但是都是一些细节的小地方,如果电脑在手,那自然是不用多说的,可偏偏是笔试,博主不由得开始紧张起来了
一些考试的具体细节由于篇幅就不便多说了,总之就是,在经历了一些波折和担惊受怕的几天后,博主还是拿到了一个较为满意的成绩,就等着面试了。
言归正传,回到本文的主题
正文:一道选择题,让我搞懂了嵌套函数的基本运行逻辑
上题目
初看此题时,博主不以为意,并没有注意到老师留下的心机(😽猫头保命),以非常自信的心算能力算出40就填了上去,而且并没有觉得有什么不妥
直到考试结束,要了原题与答案后,再探此题,慢慢发觉到其中的深意
def f1(a):
a += 10
def f2():
a *= 2
print(a)
f2()
f1(10)
运行直接报错,报错结果为
UnboundLocalError: local variable 'a' referenced before assignment
本以为是f2
中a*=2
时变量没有被定义,但报错结果与我想的结果有些许的出入
后来发现是a
被定义在函数f1
中,没有调用f1
,f2
中自然用不到f1
内的变量
本以为问题就此解决,可在调试时,我又发现了一些奇特的现象
当函数运行到箭头所指处时,并没有按照我所想的运行后面的代码,而是跳到了下面去
由于之前仅仅是学习了关于嵌套函数的知识,但并没有进行一系列的实战,所以对于嵌套函数运算的逻辑,博主还是有点懵的
查了一系列资料但感觉找不到与我的问题完全符合的,在调试也搞不清楚状况的情况下,博主便开始了自己的尝试
def f1(a):
a += 10
print(a)
def f2():
a *= 2
print(a)
f2()
f1(10)
# 运行结果
20
UnboundLocalError: local variable 'a' referenced before assignment
在def f2():
之前,一切都是正常的,那么问题便出现在此之后
的代码
给def f2():
写入参数a
,并让f2()
传递参数a
,便能解决当前问题
def f1(a):
a += 10
def f2(a):
a *= 2
print(a)
f2(a)
f1(10)
# 运行结果
40
但是关于嵌套函数运行的逻辑依旧没有清晰,于是博主又开始了下面的尝试
def f1(a):
a += 10
def f2(a):
a *= 2
print(a)
print(a)
f2(a)
f1(10)
# 运行结果
20
40
由此可以看出,在嵌套函数内,的确是先运行完当前函数,在运行嵌套的函数,而不是看见def
就往下运行新的函数
但此时,又一个新的问题出现在博主的眼前
def f1(a):
a += 10
def f2(a):
a *= 2
print(a)
print(a)
f2(a)
print(a)
f1(10)
# 运行结果
20
40
20
如果将代码放在嵌套函数的调用后面,代码在运行完嵌套函数后才会接着运行
这与之前得出的结论便有所不同了,于是博主便进行了如下测试
def f1(a):
a += 10
def f2(a):
a *= 2
print(a)
def f3(a):
a *=3
print(a)
f2(a)
f3(a)
print(a)
f1(10)
# 运行结果
NameError: name 'f3' is not defined
40
发现会报错
将代码改成这样后,虽然还是报错,但可看出规律
def f1(a):
a += 10
def f2(a):
a *= 2
print(a)
def f3(a):
a *=3
print(a)
f3(a)
f2(a)
print(a)
f3(a)
f1(10)
# 运行结果
40
120
20
NameError: name 'f3' is not defined
总结
由此博主得出结论,当嵌套函数运行时,优先运行当前函数,运行完毕时,再运行函数内的嵌套函数
但若当前函数出现涉及到嵌套函数的调用时,运行嵌套函数,运行完毕后,返回上一个函数运行至结束
若运行的嵌套函数中仍有对下级的调用,则再次运行,直到无调用下级函数为止,再一次返回函数执行至结束
想不到一个简单的函数背后竟有如此复杂的逻辑,博主搞明白后直呼学到了
Python的道路很长,知识点也很细,希望我们都能在Python道路上越走越远
砥砺前行,与君共勉