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语句的变量赋值,为什么finally块更新的变量值不会被try块返回?Is the variable from finally block scoped locally in the finally block? Or is the return value from the try block held in memory buffer and unaffected by assignment in finally block?在下面的例子中,为什么输出是Is the variable from finally block scoped locally in the finally block? Or is the return value from the try block held in memory buffer and unaffected by assignment in finally block?而不是90?

>>> def num_return():
...  try:
...    x=100
...    return x
...  finally:
...    x=90
...
>>> num_return()
100

类似地,下面的例子:

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

推荐答案

我认为你遇到的问题更多地与价值分配有关,而不是tryfinally.我建议读Facts and myths about Python names and values.

当您返回一个值时,就像将该值赋给一个变量一样,例如resultfinally总是执行以重新赋值.然后,您的示例代码可以表示为:

# try 
result = True # return
# finally 
result = False # return (reassign value)
print(result) # Output: False

# try
x = 100 
result = x # return
# finally
x = 90 
result = x # return (reassign value)
print(result) # Output: 90

# try
x = 100
result = x # return
# finally
x = 90 # no return so result not updated
print(result) # Output: 100
print(x) # Output: 90 (x is changed actually)

# try
x = [100]
result = x # return the list (result refer to a list and list is mutable)
# finally
x[0] = 90 # changing the list in-place so it affects the result
print(result) # Output: [90]

# try
x = [100]
result = x[0] # return the integer (result refer to the integer)
# finally
# changing the list in-place which have no effect to result unless reassign value by return x[0]
x[0] = 90
print(result) # Output: 100
print(x) # Output: [90] (x is changed actually)

Python-3.x相关问答推荐

这是重命名极地df列的最好方式吗?

无法使用xpath关闭selenium中的弹出窗口

如何使用 Selenium Python 连续单击一个按钮直到另一个元素出现?

如何将日期时间索引写入日期类型的表?

从 LeetCode 的 Python 解决方案类中理解关键字 self

提取图像中的背景并保存

平移数组

将两列合并为一列,将它们制成字典 - pandas - groupby

使用 GEKKO 使用代码解决最佳时间控制问题时出现 IndexError

SMTP 库 Python3:不太安全的应用程序访问

Pandas 值列中列表中元素的计数

FastAPI - 调用 API 时设置 response_model_exclude

魔术8球txt文件列表

Python中的依赖倒置

Python heapify() 时间复杂度

ImportError:无法在 PyQt5 中导入名称QStringList

谁能给我一个 Python 3 中标准输入和标准输出的快速教程?

为什么 TensorFlow 的 `tf.data` 包会减慢我的代码速度?

将字符串拆分为最大长度 X 的片段 - 仅在空格处拆分

如何在 Pandas 中的超 Big Data 框上创建数据透视表