如下例所示,finally块仅在try块中的return语句之前运行,如以下示例所示-返回False
而不是True
:
>>> def bool_return():
... try:
... return True
... finally:
... return False
...
>>> bool_return()
False
同样,以下代码返回在Finally块中设置的值:>>> def num_return():
... try:
... x=100
... return x
... finally:
... x=90
... return x
...
>>> num_return()
90
但是,对于在finally块中没有return语句的变量赋值,为什么try块不返回由finally块更新的变量值? 是否来自finally块的变量在finally块中局部作用域?还是try块的返回值保存在内存缓冲区中,而不受final块中的赋值影响? 在下面的示例中,为什么输出100而不是90?>>> def num_return():
... try:
... x=100
... return x
... finally:
... x=90
...
>>> num_return()
100
最佳答案
一个有助于确认其他人回答的小实验是将x
替换为单值列表,如下所示:
def num_return():
try:
x=[100]
return x
finally:
x[0] = 90
现在返回的值为[90]
,因此确实在finally块中修改了列表。但是,如果返回
x[0]
,则会得到100
(即使我们仅基于列表本身在finally块中发生更改的事实)。
In [1]: def num_return():
...: try:
...: x=[100]
...: return x
...: finally:
...: x[0] = 90
...:
In [2]: num_return()
Out[2]: [90]
In [3]: def num_return():
...: try:
...: x=[100]
...: return x[0]
...: finally:
...: x[0] = 90
...:
In [4]: num_return()
Out[4]: 100
关于python - 最终总是在try块中的return之前运行,那么为什么finally块中的更新不影响try块返回的变量的值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62678765/