mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-11-21 18:54:20 +01:00
Translate The dissapearing variable from outer scope example
This commit is contained in:
parent
f2b1d7e8c2
commit
58de881f93
82
translations/README-ru.md
vendored
82
translations/README-ru.md
vendored
@ -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
|
||||
# Ничего не выводится!
|
||||
```
|
||||
|
||||
---
|
||||
|
Loading…
Reference in New Issue
Block a user