mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-12-22 12:50:23 +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!" (наконец-то!).
|
||||
|
||||
---
|
||||
|
||||
|
||||
### ▶ Переменная за пределами видимости
|
||||
<!-- 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…
x
Reference in New Issue
Block a user