Python 2.7 Python在列表理解中的怪异行为

Python 2.7 Python在列表理解中的怪异行为,python-2.7,Python 2.7,为什么第二个n变为3,与给定的参数不同 列表理解中使用的n变量与传入的n相同 理解设置为1,2,最后是3 相反,将其更改为 def nrooks(n): #make board print n # prints 4 arr = [0 for n in range(n)] # if 0 for n becomes 0 for x, it works fine print n # prints 3 instead of 4 nrooks(4) 或者(令人惊讶!)

为什么第二个
n
变为
3
,与给定的参数不同

列表理解中使用的
n
变量与传入的
n
相同

理解设置为
1
2
,最后是
3

相反,将其更改为

def nrooks(n):
    #make board
    print n # prints 4
    arr = [0 for n in range(n)] # if 0 for n becomes 0 for x, it works fine
    print n # prints 3 instead of 4

nrooks(4)
或者(令人惊讶!)

Python 3

这已被修复。

:

我们还在Python3中做了另一个更改,以改进等价性 在列表理解和生成器表达式之间。在Python 2中, 列表理解将循环控制变量“泄漏”到 周边范围:

这是list最初实现的产物 理解;这是Python的“肮脏的小秘密”之一 年。一开始,这是一个有意的妥协,以列入名单 理解速度快得令人眼花缭乱,虽然这不是一个常见的陷阱 对于初学者来说,它肯定偶尔会刺痛人。发电机 我们不能这样做。生成器表达式是 使用生成器实现,其执行需要单独的 执行帧

然而,在Python3中,我们决定修复 使用与之相同的实施策略列出理解 生成器表达式。因此,在Python 3中,上面的示例(在 修改使用打印(x):-)将打印“之前”

或者
arr = [0 for _ in range(n)]
arr = list(0 for n in range(n))
x = 'before'
a = [x for x in 1, 2, 3]
print x # this prints '3', not 'before'