Py学习  »  Python

Python在try except finally中与返回值混淆

Fed_Dragon • 3 年前 • 1484 次点击  

以下是我的一段代码:

def main():
    num = 0
    try:
        raise Exception('This is the error message.')
    except Exception:
        num += 1
        return num
    finally:
        num += 1

a = main()
print(a)

返回值为 1 而不是 2 ,这对我来说没有多大意义。

我以为它会返回2,因为最终应该在返回值之前执行。

有人能帮我理解吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/130706
 
1484 次点击  
文章 [ 4 ]  |  最新文章 3 年前
Jair Júnior
Reply   •   1 楼
Jair Júnior    3 年前

那是因为你要回来,除了街区 使用返回字将结束此函数中的代码执行。 为了避免这种情况,你可以这样写:

def main():
 num = 0
 try:
    raise Exception('This is the error message.')
 except Exception:
    num += 1
 finally:
    num += 1
 return num

a = main()
print(a)
user2357112 supports Monica
Reply   •   2 楼
user2357112 supports Monica    3 年前

这个 finally 在返回值之前执行,但返回值已被计算。

return num 评估 num ,得到 1 ,然后 最后 街区开始了。这个 最后 块增量 号码 ,但返回值已经计算过了,所以这无关紧要。最后 1. 返回“计算早”的值。

mozway
Reply   •   3 楼
mozway    3 年前

这个 finally 已执行(这在 documentation ),但当你返回 不变对象 ,由于您返回的名称现在是另一个作用域的一部分,因此修改不可见。

对于可变对象(例如列表),这将如您所期望的那样起作用:

def main():
    lst = [0]
    try:
        raise Exception('This is the error message.')
    except Exception:
        lst[0] += 1
        return lst
    finally:
        lst[0] += 1
a = main()
print(a)

输出: [2]

Patrick Haugh
Reply   •   4 楼
Patrick Haugh    3 年前

您遇到了标识符和值之间的差异。 num += 1 正在创建一个新的 int 对象并指定 num 标识符来指向它。这并不会改变现状 智力 标识符已指向的对象。(对于较小的值 智力 对象被缓存,但这是一个实现细节)

在下面的代码中,您可以看到对对象进行变异的操作的区别:

def y():
    l = []
    try:
        raise Exception
    except Exception:
        print("except")
        l.append(1)
        return l
    finally:
        print("finally")
        l.append(2)

print(y())
# except
# finally
# [1, 2]