mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-11-22 11:04:25 +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).
|
* Также есть объяснение в официальном [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