mirror of
https://github.com/leisurelicht/wtfpython-cn.git
synced 2024-12-06 16:30:12 +08:00
UPDATE.Evaluation time discrepancy
This commit is contained in:
parent
089b5e6450
commit
9ab5e14465
23
README.md
23
README.md
@ -704,13 +704,14 @@ for i, some_dict[i] in enumerate(some_string):
|
|||||||
1\.
|
1\.
|
||||||
```py
|
```py
|
||||||
array = [1, 8, 15]
|
array = [1, 8, 15]
|
||||||
|
# 一个典型的生成器表达式
|
||||||
g = (x for x in array if array.count(x) > 0)
|
g = (x for x in array if array.count(x) > 0)
|
||||||
array = [2, 8, 22]
|
array = [2, 8, 22]
|
||||||
```
|
```
|
||||||
|
|
||||||
**Output:**
|
**Output:**
|
||||||
```py
|
```py
|
||||||
>>> print(list(g))
|
>>> print(list(g)) #其他的值去哪儿了?
|
||||||
[8]
|
[8]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -735,6 +736,23 @@ array_2[:] = [1,2,3,4,5]
|
|||||||
[1,2,3,4,5]
|
[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]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Output:**
|
||||||
|
```py
|
||||||
|
>>> print(list(gen))
|
||||||
|
[401, 501, 601, 402, 502, 602, 403, 503, 603]
|
||||||
|
```
|
||||||
|
|
||||||
#### 💡 说明
|
#### 💡 说明
|
||||||
|
|
||||||
- 在[生成器](https://wiki.python.org/moin/Generators)表达式中, `in` 子句在声明时执行, 而条件子句则是在运行时执行.
|
- 在[生成器](https://wiki.python.org/moin/Generators)表达式中, `in` 子句在声明时执行, 而条件子句则是在运行时执行.
|
||||||
@ -742,6 +760,9 @@ array_2[:] = [1,2,3,4,5]
|
|||||||
- 第二部分中 `g1` 和 `g2` 的输出差异则是由于变量 `array_1` 和 `array_2` 被重新赋值的方式导致的.
|
- 第二部分中 `g1` 和 `g2` 的输出差异则是由于变量 `array_1` 和 `array_2` 被重新赋值的方式导致的.
|
||||||
- 在第一种情况下, `array_1` 被绑定到新对象 `[1,2,3,4,5]`, 因为 `in` 子句是在声明时被执行的, 所以它仍然引用旧对象 `[1,2,3,4]`(并没有被销毁).
|
- 在第一种情况下, `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]`).
|
- 在第二种情况下, 对 `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` 一样)。 [PEP-289](https://www.python.org/dev/peps/pep-0289/#the-details) 中解释了(只有)`array_4` 值更新的原因
|
||||||
|
> 只有最外层的 for 表达式会立即计算,其他表达式会延迟到生成器运行。
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user