Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';最后';语句在递归函数[Python 3.6]p中执行两次_Python_Recursion_Python 3.6 - Fatal编程技术网

';最后';语句在递归函数[Python 3.6]p中执行两次

';最后';语句在递归函数[Python 3.6]p中执行两次,python,recursion,python-3.6,Python,Recursion,Python 3.6,我试着用谷歌搜索,但没有发现类似的问题。我确信这是件愚蠢的事,但我似乎不明白 我有以下代码: def f(a): try: 4 / a except: f(2) else: print('else') finally: print("finally") 当我以0作为参数调用函数时:f(0) 它返回: else finally finally 因此,根据我的理解,这里是应该发生的事情: 0被馈送到

我试着用谷歌搜索,但没有发现类似的问题。我确信这是件愚蠢的事,但我似乎不明白

我有以下代码:

def f(a):
    try:
        4 / a
    except:
        f(2)
    else:
        print('else')
    finally:
        print("finally")
当我以0作为参数调用函数时:
f(0)

它返回:

else
finally
finally
因此,根据我的理解,这里是应该发生的事情:

  • 0被馈送到函数
  • try语句无法执行它
  • Exception语句获取触发器,它使用合法参数2再次调用函数
  • try语句现在可以了
  • else语句打印
    else
  • finally语句打印
    finally

为什么
finally
会打印两次?

使用
f(0)
调用时,
finally
块会被调用两次。一次用于调用
f(2)
,然后再次用于附带调用
f(0)

这是因为
4/0
导致异常,该异常通过
f(2)
触发对
f
的第二次调用


finally
将首先调用
f(2)
,然后调用
f(0)
——因为如果将最后一行更改为
print(“finally”,a),则从
f(0)
调用
finally

你应该能够看到发生了什么。为什么第二个
最后
在成功执行后会被打印?@4247应该是这样的。所以
else
最终
都在else语句的范围内打印,对吗?最后一个
finally
在f(0)的作用域内?因为对f(2)的调用在f(0)调用f(2)完成之前就完成了。哎呀,我忘了我输入了一个新的作用域,而不是回到开头。谢谢大家!