EX.Loop variables leaking out

This commit is contained in:
暮晨 2018-11-25 16:26:27 +08:00 committed by 暮晨
parent b739f93c85
commit 9382617b9f

View File

@ -58,7 +58,7 @@ So, here we go...
- [> Modifying a dictionary while iterating over it/迭代字典时的修改](#-modifying-a-dictionary-while-iterating-over-it迭代字典时的修改) - [> Modifying a dictionary while iterating over it/迭代字典时的修改](#-modifying-a-dictionary-while-iterating-over-it迭代字典时的修改)
- [> Stubborn `del` operator/坚强的 `del` *](#-stubborn-del-operator坚强的-del-) - [> Stubborn `del` operator/坚强的 `del` *](#-stubborn-del-operator坚强的-del-)
- [> Deleting a list item while iterating/迭代列表时删除元素](#-deleting-a-list-item-while-iterating迭代列表时删除元素) - [> Deleting a list item while iterating/迭代列表时删除元素](#-deleting-a-list-item-while-iterating迭代列表时删除元素)
- [> Loop variables leaking out!](#-loop-variables-leaking-out) - [> Loop variables leaking out!/循环变量泄漏!](#-loop-variables-leaking-out循环变量泄漏)
- [> Beware of default mutable arguments!](#-beware-of-default-mutable-arguments) - [> Beware of default mutable arguments!](#-beware-of-default-mutable-arguments)
- [> Catching the Exceptions](#-catching-the-exceptions) - [> Catching the Exceptions](#-catching-the-exceptions)
- [> Same operands, different story!](#-same-operands-different-story) - [> Same operands, different story!](#-same-operands-different-story)
@ -1485,7 +1485,7 @@ for idx, item in enumerate(list_4):
--- ---
### > Loop variables leaking out! ### > Loop variables leaking out!/循环变量泄漏!
1\. 1\.
```py ```py
@ -1501,11 +1501,11 @@ print(x, ': x in global')
6 : x in global 6 : x in global
``` ```
But `x` was never defined outside the scope of for loop... 但是 `x` 从未在循环外被定义...
2\. 2\.
```py ```py
# This time let's initialize x first # 这次我们先初始化x
x = -1 x = -1
for x in range(7): for x in range(7):
if x == 6: if x == 6:
@ -1538,13 +1538,13 @@ print(x, ': x in global')
1 : x in global 1 : x in global
``` ```
#### 💡 Explanation: #### 💡 说明:
- In Python, for-loops use the scope they exist in and leave their defined loop-variable behind. This also applies if we explicitly defined the for-loop variable in the global namespace before. In this case, it will rebind the existing variable. - 在 Python 中, for 循环使用所在作用域并在结束后保留定义的循环变量. 如果我们曾在全局命名空间中定义过循环变量. 在这种情况下, 它会重新绑定现有变量.
- The differences in the output of Python 2.x and Python 3.x interpreters for list comprehension example can be explained by following change documented in [Whats New In Python 3.0](https://docs.python.org/3/whatsnew/3.0.html) documentation: - Python 2.x 和 Python 3.x 解释器在列表推导式示例中的输出差异, 在文档 [Whats New In Python 3.0](https://docs.python.org/3/whatsnew/3.0.html) 中可以找到相关的解释:
> "List comprehensions no longer support the syntactic form `[... for var in item1, item2, ...]`. Use `[... for var in (item1, item2, ...)]` instead. Also, note that list comprehensions have different semantics: they are closer to syntactic sugar for a generator expression inside a `list()` constructor, and in particular the loop control variables are no longer leaked into the surrounding scope." > "列表推导不再支持句法形式 `[... for var in item1, item2, ...]`. 取而代之的是 `[... for var in (item1, item2, ...)]`. 另外, 注意列表推导具有不同的语义: 它们更接近于 `list()` 构造函数中生成器表达式的语法糖(译: 这一句我也不是很明白), 特别是循环控制变量不再泄漏到周围的作用域中."
--- ---