From 58de881f9320e4f18fba43a52d53601fb99d5303 Mon Sep 17 00:00:00 2001 From: Vadim Nifadev <36514612+nifadyev@users.noreply.github.com> Date: Mon, 22 Apr 2024 14:51:49 +0300 Subject: [PATCH] Translate The dissapearing variable from outer scope example --- translations/README-ru.md | 82 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/translations/README-ru.md b/translations/README-ru.md index 30384e7..382aab8 100644 --- a/translations/README-ru.md +++ b/translations/README-ru.md @@ -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). --- + + +### ▶ Исчезающая переменная из внешней области видимости + + +```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 + # Ничего не выводится! + ``` + +---