优秀的编程知识分享平台

网站首页 > 技术文章 正文

一波三折,总算理解了finally和return的执行顺序

nanyue 2025-03-11 19:28:50 技术文章 8 ℃

作者:麦叔

来源:麦叔编程

一直以来,我的理解是:

return语句是函数的终结,一旦遇到return,函数马上就结束返回了。

直到认真学习了try...except...finally异常处理才发现并不总是这样的。但这个问题你真的理解吗?

return语句和finally语句到底谁先执行呢?

可能没有你想象的那么简单!

finally语句

来看这段代码例子:

def play_numer():
    number_list = []
    while True:
        print('-----------------')
        try:
            number = input('输入一个数字:')
            print(int(number)/2)
            if number == '886':
                return
        except Exception as e:
            print(f'出错了:{e}')
        finally:
            number_list.append(number)
            print(number_list)

play_numer()

执行结果如下:

-----------------
输入一个数字:123
61.5
['123']
-----------------
输入一个数字:321
160.5
['123', '321']
-----------------
输入一个数字:886
443.0
['123', '321', '886']

从结果可以看出,就算遇到了886,也在退出之前成功打印了包含886的列表。这似乎说明:

finally语句先执行,然后再执行return语句。

推翻认知的例子

我们现在修改一下代码,会推翻之前的理解:

def play_numer():
    number_list = []
    while True:
        print('-----------------')
        try:
            number = input('输入一个数字:')
            print(int(number)/2)
            if number == '886':
                return number_list.append('return')
        except Exception as e:
            print(f'出错了:{e}')
        finally:
            number_list.append(number)
            print(number_list)

play_numer()

代码几乎和前面一样,唯一的区别是在return语句中执行了这个操作:number_list.append('return')。

看看打印结果:

-----------------
输入一个数字:123
61.5
['123']
-----------------
输入一个数字:321
160.5
['123', '321']
-----------------
输入一个数字:886
443.0
['123', '321', 'return', '886']

完全一样的输入,看看最后一条打印结果:字符串return在886之前被加入到了列表,这似乎又说明:

return语句在finally之前执行,和前面的结论相反。

结论

这个问题的关键在于认识到:

return语句包含两部分,一部分return关键字后的表达式,比如number_list.append('return'),另一部分是return本身,也就是退出函数的操作。

所以正确的顺序是:

return表达式,finally语句块,return操作

最近发表
标签列表