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'