mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-11-22 02:54:25 +01:00
Translate Evaluation time discrepancy example
This commit is contained in:
parent
654da92e88
commit
259fb23c7b
69
translations/README-ru.md
vendored
69
translations/README-ru.md
vendored
@ -787,3 +787,72 @@ for i, some_dict[i] in enumerate(some_string):
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
### ▶ Расхождение во времени исполнения
|
||||
<!-- Example ID: 6aa11a4b-4cf1-467a-b43a-810731517e98 --->
|
||||
1\.
|
||||
```py
|
||||
array = [1, 8, 15]
|
||||
# Типичный генератор
|
||||
gen = (x for x in array if array.count(x) > 0)
|
||||
array = [2, 8, 22]
|
||||
```
|
||||
|
||||
**Вывод:**
|
||||
|
||||
```py
|
||||
>>> print(list(gen)) # Куда подевались остальные значения?
|
||||
[8]
|
||||
```
|
||||
|
||||
2\.
|
||||
|
||||
```py
|
||||
array_1 = [1,2,3,4]
|
||||
gen_1 = (x for x in array_1)
|
||||
array_1 = [1,2,3,4,5]
|
||||
|
||||
array_2 = [1,2,3,4]
|
||||
gen_2 = (x for x in array_2)
|
||||
array_2[:] = [1,2,3,4,5]
|
||||
```
|
||||
|
||||
**Вывод:**
|
||||
```py
|
||||
>>> print(list(gen_1))
|
||||
[1, 2, 3, 4]
|
||||
|
||||
>>> print(list(gen_2))
|
||||
[1, 2, 3, 4, 5]
|
||||
```
|
||||
|
||||
3\.
|
||||
|
||||
```py
|
||||
array_3 = [1, 2, 3]
|
||||
array_4 = [10, 20, 30]
|
||||
gen = (i + j for i in array_3 for j in array_4)
|
||||
|
||||
array_3 = [4, 5, 6]
|
||||
array_4 = [400, 500, 600]
|
||||
```
|
||||
|
||||
**Вывод:**
|
||||
```py
|
||||
>>> print(list(gen))
|
||||
[401, 501, 601, 402, 502, 602, 403, 503, 603]
|
||||
```
|
||||
|
||||
#### 💡 Пояснение
|
||||
|
||||
- В выражении [генераторе](https://wiki.python.org/moin/Generators) условие `in` оценивается во время объявления, но условие `if` оценивается во время выполнения.
|
||||
- Перед выполнением кода, значение переменной `array` изменяется на список `[2, 8, 22]`, а поскольку из `1`, `8` и `15` только счетчик `8` больше `0`, генератор выдает только `8`.
|
||||
- Различия в выводе `g1` и `g2` во второй части связаны с тем, как переменным `array_1` и `array_2` присваиваются новые значения.
|
||||
- В первом случае `array_1` привязывается к новому объекту `[1,2,3,4,5]`, а поскольку `in` выражение исполняется во время объявления, оно по-прежнему ссылается на старый объект `[1,2,3,4]` (который не уничтожается).
|
||||
- Во втором случае присвоение среза `array_2` обновляет тот же старый объект `[1,2,3,4]` до `[1,2,3,4,5]`. Следовательно, и `g2`, и `array_2` по-прежнему имеют ссылку на один и тот же объект (который теперь обновлен до `[1,2,3,4,5]`).
|
||||
- Хорошо, следуя приведенной выше логике, не должно ли значение `list(gen)` в третьем фрагменте быть `[11, 21, 31, 12, 22, 32, 13, 23, 33]`? (потому что `array_3` и `array_4` будут вести себя так же, как `array_1`). Причина, по которой (только) значения `array_4` обновляются, объясняется в [PEP-289](https://www.python.org/dev/peps/pep-0289/#the-details)
|
||||
|
||||
> Только крайнее for-выражение исполняется немедленно, остальные выражения откладываются до запуска генератора.
|
||||
|
||||
---
|
||||
|
Loading…
Reference in New Issue
Block a user