社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Fed_Dragon • 3 年前 • 1435 次点击  

以下是我的一段代码:

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
 
1435 次点击  
文章 [ 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]