У меня есть следующий код:
def foo():
e = None
try:
raise Exception('I wish you would except me for who I am.')
except Exception as e:
print(e)
print(e)
foo()
В Python 2.7 это выполняется как ожидалось и печатает:
I wish you would except me for who I am.
I wish you would except me for who I am.
Однако в Python 3.x печатается первая строка, а вторая - нет. Кажется, что она удаляет переменную в охватывающей области, предоставляя мне следующую трассировку из последнего оператора печати:
Traceback (most recent call last):
File "python", line 9, in <module>
File "python", line 7, in foo
UnboundLocalError: local variable 'e' referenced before assignment
Это почти как если инструкция del e
вставляется после блока except
. Есть ли какие-либо аргументы в пользу такого поведения? Я мог бы это понять, если разработчики Python хотели, чтобы блоки имели свою собственную локальную область, а не течь в окружающую область, но почему она должна удалять переменную во внешней области, которая ранее была назначена?