Translate Loop variables leaking out example

This commit is contained in:
Vadim Nifadev 2024-04-23 11:23:47 +03:00
parent 3df9d0e4e3
commit 473e4229f2
1 changed files with 65 additions and 0 deletions

View File

@ -2230,3 +2230,68 @@ for idx, item in enumerate(list_4):
Первый аргумент сжатия должен иметь наименьшее число элементов
---
### ▶ Утечка переменных внутри цикла
<!-- Example ID: ccec7bf6-7679-4963-907a-1cd8587be9ea --->
1\.
```py
for x in range(7):
if x == 6:
print(x, ': for x inside loop')
print(x, ': x in global')
```
**Вывод:**
```py
6 : for x inside loop
6 : x in global
```
Но `x` не была определена за пределами цикла `for`...
2\.
```py
# В этот раз определим x до цикла
x = -1
for x in range(7):
if x == 6:
print(x, ': for x inside loop')
print(x, ': x in global')
```
**Вывод:**
```py
6 : for x inside loop
6 : x in global
```
3\.
**Вывод (Python 2.x):**
```py
>>> x = 1
>>> print([x for x in range(5)])
[0, 1, 2, 3, 4]
>>> print(x)
4
```
**Вывод (Python 3.x):**
```py
>>> x = 1
>>> print([x for x in range(5)])
[0, 1, 2, 3, 4]
>>> print(x)
1
```
#### 💡 Объяснение:
- В Python циклы for используют область видимости, в которой они существуют, и оставляют свою определенную переменную цикла после завершения. Это также относится к случаям, когда мы явно определили переменную цикла for в глобальном пространстве имен. В этом случае будет произведена перепривязка существующей переменной.
- Различия в выводе интерпретаторов Python 2.x и Python 3.x для примера с пониманием списков можно объяснить следующим изменением, задокументированным в журнале изменений [What's New In Python 3.0](https://docs.python.org/3/whatsnew/3.0.html):
> "Генераторы списков ("list comprehensions") больше не поддерживает синтаксическую форму `[... for var in item1, item2, ...]`. Вместо этого используйте `[... for var in (item1, item2, ...)]`. Кроме того, обратите внимание, что генераторы списков имеют другую семантику: они ближе к синтаксическому сахару для генераторного выражения внутри конструктора `list()`, и, в частности, управляющие переменные цикла больше не просачиваются в окружающую область видимости."
---