python - 最终总是在try块中的return之前运行,那么为什么finally块中的更新不影响try块返回的变量的值?

如下例所示,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