Translate The dissapearing variable from outer scope example

This commit is contained in:
Vadim Nifadev 2024-04-22 14:51:49 +03:00
parent f2b1d7e8c2
commit 58de881f93
1 changed files with 82 additions and 0 deletions

View File

@ -1724,3 +1724,85 @@ TypeError: 'tuple' object does not support item assignment
* Также есть объяснение в официальном [Python FAQ](https://docs.python.org/3/faq/programming.html#why-does-a-tuple-i-item-raise-an-exception-when-the-addition-works).
---
### ▶ Исчезающая переменная из внешней области видимости
<!-- Example ID: 7f1e71b6-cb3e-44fb-aa47-87ef1b7decc8 --->
```py
e = 7
try:
raise Exception()
except Exception as e:
pass
```
**Результат (Python 2.x):**
```py
>>> print(e)
# Ничего не выводит
```
**Результат (Python 3.x):**
```py
>>> print(e)
NameError: name 'e' is not defined
```
#### 💡 Объяснение:
* [Источник](https://docs.python.org/3/reference/compound_stmts.html#except)
Когда исключение было назначено с помощью ключевого слова `as`, оно очищается в конце блока `except`. Это происходит так, как если бы
```py
except E as N:
foo
```
разворачивалось до
```py
except E as N:
try:
foo
finally:
del N
```
Это означает, что исключению должно быть присвоено другое имя, чтобы на него можно было ссылаться после завершения блока `except`. Исключения очищаются, потому что с прикрепленным к ним трейсбэком они образуют цикл ссылок со стеком вызовов, сохраняя все локальные объекты в этой стэке до следующей сборки мусора.
* В Python clauses не имеют области видимости. В примере все объекты в одной области видимости, а переменная `e` была удалена из-за выполнения блока `except`. Этого нельзя сказать о функциях, которые имеют отдельные внутренние области видимости. Пример ниже иллюстрирует это:
```py
def f(x):
del(x)
print(x)
x = 5
y = [5, 4, 3]
```
**Результат:**
```py
>>> f(x)
UnboundLocalError: local variable 'x' referenced before assignment
>>> f(y)
UnboundLocalError: local variable 'x' referenced before assignment
>>> x
5
>>> y
[5, 4, 3]
```
* В Python 2.x, имя переменной `e` назначается на экземпляр `Exception()`, и при попытки вывести значение `e` ничего не выводится.
**Результат (Python 2.x):**
```py
>>> e
Exception()
>>> print e
# Ничего не выводится!
```
---