var*_*ble 22 python python-3.x
finally 块在 try 块中的 return 语句之前运行,如下例所示 - 返回False而不是True:
>>> def bool_return():
... try:
... return True
... finally:
... return False
...
>>> bool_return()
False
Run Code Online (Sandbox Code Playgroud)
类似地,以下代码返回在 finally 块中设置的值:
>>> def num_return():
... try:
... x=100
... return x
... finally:
... x=90
... return x
...
>>> num_return()
90
Run Code Online (Sandbox Code Playgroud)
但是,对于finally块中没有return语句的变量赋值,为什么finally块更新的变量值没有被try块返回?finally 块中的变量是否在 finally 块中局部作用域?还是来自内存缓冲区中的 try 块的返回值不受 finally 块中赋值的影响?在下面的例子中,为什么输出是 100 而不是 90?
>>> def num_return():
... try:
... x=100
... return x
... finally:
... x=90
...
>>> num_return()
100
Run Code Online (Sandbox Code Playgroud)
类似下面的例子:
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
Run Code Online (Sandbox Code Playgroud)
Ada*_*Er8 11
一个有助于确认其他人回答的小实验是x用单值列表替换,如下所示:
def num_return():
try:
x=[100]
return x
finally:
x[0] = 90
Run Code Online (Sandbox Code Playgroud)
现在返回的值为[90],因此确实在 finally 块中修改了列表。
但是如果你 return 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
Run Code Online (Sandbox Code Playgroud)
小智 5
以下条款取自:https://docs.python.org/3/tutorial/errors.html(第 8.6 节)
\n\n\n\n
break如果 try 语句到达break、 continue 或 return 语句,则finally 子句将在,continue或return语句\xe2\x80\x99s 执行之前执行。
在第一个示例中, return False 在 return True 之后执行,因此是结果。这也解释了第二个例子。
\n对于最后一个,您的 return x 保存了代码中该点的 x 值,更改变量 x 的值不会更改 return 语句的值。
\n我认为你遇到的问题更多地与价值分配有关,而不是与“做什么”try有关finally。我建议阅读有关 Python 名称和值的事实和神话。
例如,当您返回一个值时,它就像将值分配给变量一样,result并且finally始终执行以重新分配该值。然后,您的示例代码可能表示为:
# 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)
Run Code Online (Sandbox Code Playgroud)