mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-11-22 02:54:25 +01:00
Translate The out of scope varibale example
This commit is contained in:
parent
b1a8aadd70
commit
2aa7b37540
83
translations/README-ru.md
vendored
83
translations/README-ru.md
vendored
@ -2037,3 +2037,86 @@ Deleted!
|
|||||||
+ Вызов `globals` (или вообще выполнение чего-либо, что будет иметь результат, отличный от `None`) заставил `_` сослаться на новый результат, отбросив существующую ссылку. Теперь количество ссылок достигло 0, и мы можем видеть, как выводится "Deleted!" (наконец-то!).
|
+ Вызов `globals` (или вообще выполнение чего-либо, что будет иметь результат, отличный от `None`) заставил `_` сослаться на новый результат, отбросив существующую ссылку. Теперь количество ссылок достигло 0, и мы можем видеть, как выводится "Deleted!" (наконец-то!).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
### ▶ Переменная за пределами видимости
|
||||||
|
<!-- Example ID: 75c03015-7be9-4289-9e22-4f5fdda056f7 --->
|
||||||
|
|
||||||
|
1\.
|
||||||
|
```py
|
||||||
|
a = 1
|
||||||
|
def some_func():
|
||||||
|
return a
|
||||||
|
|
||||||
|
def another_func():
|
||||||
|
a += 1
|
||||||
|
return a
|
||||||
|
```
|
||||||
|
|
||||||
|
2\.
|
||||||
|
```py
|
||||||
|
def some_closure_func():
|
||||||
|
a = 1
|
||||||
|
def some_inner_func():
|
||||||
|
return a
|
||||||
|
return some_inner_func()
|
||||||
|
|
||||||
|
def another_closure_func():
|
||||||
|
a = 1
|
||||||
|
def another_inner_func():
|
||||||
|
a += 1
|
||||||
|
return a
|
||||||
|
return another_inner_func()
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
```py
|
||||||
|
>>> some_func()
|
||||||
|
1
|
||||||
|
>>> another_func()
|
||||||
|
UnboundLocalError: local variable 'a' referenced before assignment
|
||||||
|
|
||||||
|
>>> some_closure_func()
|
||||||
|
1
|
||||||
|
>>> another_closure_func()
|
||||||
|
UnboundLocalError: local variable 'a' referenced before assignment
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 💡 Объяснение:
|
||||||
|
* Когда вы делаете присваивание переменной в области видимости, она становится локальной для этой области. Так `a` становится локальной для области видимости `another_func`, но она не была инициализирована ранее в той же области видимости, что приводит к ошибке.
|
||||||
|
* Для изменения переменной `a` из внешней области видимости внутри функции `another_func`, необходимо использовать ключевое слово `global`.
|
||||||
|
```py
|
||||||
|
def another_func()
|
||||||
|
global a
|
||||||
|
a += 1
|
||||||
|
return a
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
```py
|
||||||
|
>>> another_func()
|
||||||
|
2
|
||||||
|
```
|
||||||
|
* В `another_closure_func` переменная `a` становится локальной для области видимости `another_inner_func`, но она не была инициализирована ранее в той же области видимости, поэтому выдает ошибку.
|
||||||
|
* Чтобы изменить переменную внешней области видимости `a` в `another_inner_func`, используйте ключевое слово `nonlocal`. Утверждение nonlocal используется для обращения к переменным, определенным в ближайшей внешней (за исключением глобальной) области видимости.
|
||||||
|
|
||||||
|
```py
|
||||||
|
def another_func():
|
||||||
|
a = 1
|
||||||
|
def another_inner_func():
|
||||||
|
nonlocal a
|
||||||
|
a += 1
|
||||||
|
return a
|
||||||
|
return another_inner_func()
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
```py
|
||||||
|
>>> another_func()
|
||||||
|
2
|
||||||
|
```
|
||||||
|
|
||||||
|
* Ключевые слова `global` и `nonlocal` указывают интерпретатору python не объявлять новые переменные и искать их в соответствующих внешних областях видимости.
|
||||||
|
* Прочитайте [это](https://sebastianraschka.com/Articles/2014_python_scope_and_namespaces.html) короткое, но потрясающее руководство, чтобы узнать больше о том, как работают пространства имен и разрешение областей видимости в Python.
|
||||||
|
|
||||||
|
---
|
||||||
|
Loading…
Reference in New Issue
Block a user