zoukankan      html  css  js  c++  java
  • Python中关于try...finally的一些疑问

    最近看Vamei的Python文章,其中一篇讲异常处理的,原本看完没啥疑惑,或许是自己想的简单了。

    看到评论,一个园友的问题引起我的兴趣。

    他的问题是

    def func(x):
        try:
            return ++x
        finally:
            return x+1
    

    print func(11)
    你觉得是几?

    看到问题,觉得肯定是12啊,这有什么问题呢?

    下边看看我写的例子,就明白其中的问题了。

    先看这个

    def f():
        try:
            print 1
            return 1
        finally:
            print 0
            return 0
    

    print f()
    结果为 1 0 0
    以运行结果为准,说明无论try里执行什么,即使是return,也会调用finally的。
    但是有一个问题,为什么最后输出的不是1而是0呢?明明try里面已经返回1了!
    看下边的代码

    def f():
        try:
            print 1
            return 1
        finally:
            print 0
            #return 0
    

    将finally的return屏蔽掉,你或许猜到结果了

    结果为 1 0 1

    诧异吗?

    对比上个结果,说明try的返回值被finally的返回值覆盖了,或许是因为一个函数只能有一个返回值,以最后一个结果为准

    由此我想再验证下else的情况,如下

    def f():
        try:
            print 1
            return 1
        except:
            return 2
        else:
            print 3
            return 3
        finally:
            print 0
            #return 0
    

    你觉得,没有异常else会执行吗?

    如你所料,并没有执行。

    结果为 1 0 1

    说明try里面运行完之后return,阻挡了else的执行,但是并没有影响finally的执行。

    借用Vamer文章的两句话:

    “如果try中没有异常,那么except部分将跳过,执行else中的语句。

    finally是无论是否有异常,最后都要做的一些事情。”

    这里补充一句,在含有return的情况下,并不会阻碍finally的执行。

  • 相关阅读:
    微软新一代Surface,该怎么看?
    Windows 8创新之路——样章分享
    微软新一代Surface发布,参数曝光
    从MS Word到Windows Live Writer
    《计算机科学基础》学习笔记_Part 1 Computer and Data
    我看Windows 8.1
    Hyper-V初涉_早期Windows安装虚拟硬件驱动
    2020.09.05【省选组】模拟 总结
    2020.08.15【NOIP提高组】模拟 总结
    2020.08.14【省选B组】模拟 总结
  • 原文地址:https://www.cnblogs.com/liuye1990/p/9373900.html
Copyright © 2011-2022 走看看