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相关问答推荐

S的两极是什么,相当于大Pandas 的`.ilo‘方法?

为什么我在BLE中的广告代码在发送包裹之间需要大约1秒

添加任意数量的 pandas 数据框

通过 Pandas 通过用户定义函数重命名数据框列

嵌套协议的使用(协议成员也是协议)

这种类型提示有什么作用?

如何知道Pandas 列中的每个后续值是否都大于前面的值? Python相关

python用户输入5个偶数并打印最大的

是否将dict转换为一个数据帧,每个值都有重复的键?

保存 StandardScaler() 模型以用于新数据集

无法在 Windows Python 3.5 上安装 Levenshtein 距离包

为 python3 安装 opencv

在数据类中创建类变量的正确方法

Python3四舍五入到最接近的偶数

Python中调用者函数的访问变量

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

如何找出从哪个模块导入名称?

类方法和实例方法同名

是否可以在每个路由的基础上限制 Flask POST 数据大小?

哪个更有效:Python 文档字符串还是类型提示?