Оператор 'finally' выполняется дважды в рекурсивной функции [Python 3.6] p - PullRequest
0 голосов
/ 30 октября 2018

Я попытался найти его, но не смог найти подобную проблему. Я уверен, что это что-то глупое, но я не могу этого понять.

У меня есть следующий код:

def f(a):
    try:
        4 / a
    except:
        f(2)
    else:
        print('else')
    finally:
        print("finally")

Когда я вызываю функцию с 0 в качестве аргумента: f(0)
Возвращает:

else
finally
finally

Итак, в моем понимании, вот что должно произойти:

  • 0 получает функцию;
  • оператор try не может его выполнить;
  • Кроме оператора оператор получает триггеры, которые снова вызывают функцию с допустимым аргументом, 2.
  • С оператором try теперь все в порядке;
  • оператор выписки else else
  • наконец-то выписки оператора finally

Почему finally печатается дважды?

1 Ответ

0 голосов
/ 30 октября 2018

Когда вы вызываете с f(0), блок finally вызывается дважды. Один раз для звонка на f(2), а затем снова для входящего звонка на f(0).

Это потому, что 4 / 0 приводит к исключению, которое вызывает второй вызов f через f(2).

finally будет вызываться сначала для вызова на f(2), затем для вызова на f(0) - потому что f(2) вызывается с f(0).

...