一道选择题,让我搞懂了嵌套函数的基本运行逻辑

引子

  博主目前就读于河北某一所软件学校,虽然已经有过一段时间的学习,但是在总体上来说,依旧是一位初学者
在这里插入图片描述

  恰巧学校要对我们进行分层(个人还是比较支持这种行为的,因为确实很多人不学的话。对班级的风气影响颇大),以考试+面试的结果分成2个班。
  所以,自认为学的不错的博主,怀揣着想去小班的梦想就踏入了考场(占用了我们为数不多的假期😭😭)
在这里插入图片描述
  因为之前就有了解到是笔试,虽然博主已很长时间没有碰过笔了,但是自认为学的还不错的博主感觉丝毫不慌
在这里插入图片描述
  结果拿到卷子的博主当场傻眼,题不是很难,但是都是一些细节的小地方,如果电脑在手,那自然是不用多说的,可偏偏是笔试,博主不由得开始紧张起来了
在这里插入图片描述
  一些考试的具体细节由于篇幅就不便多说了,总之就是,在经历了一些波折和担惊受怕的几天后,博主还是拿到了一个较为满意的成绩,就等着面试了。
  言归正传,回到本文的主题

正文:一道选择题,让我搞懂了嵌套函数的基本运行逻辑

上题目
在这里插入图片描述
  初看此题时,博主不以为意,并没有注意到老师留下的心机(😽猫头保命),以非常自信的心算能力算出40就填了上去,而且并没有觉得有什么不妥
  直到考试结束,要了原题与答案后,再探此题,慢慢发觉到其中的深意

def f1(a):
    a += 10
    def f2():
        a *= 2
        print(a)
    f2()
f1(10)

  运行直接报错,报错结果为

UnboundLocalError: local variable 'a' referenced before assignment

  本以为是f2a*=2时变量没有被定义,但报错结果与我想的结果有些许的出入
  后来发现是a被定义在函数f1中,没有调用f1f2中自然用不到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道路上越走越远
  砥砺前行,与君共勉

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值