3

为什么在与推导过滤器一起使用时,反转此推导中的循环顺序会产生不同的结果?

print len([cell for row in cells for cell in row])
print len([cell for cell in row for row in cells])
print len([cell for row in cells for cell in row if cell.rect.collidepoint(pos)])
print len([cell for cell in row for row in cells if cell.rect.collidepoint(pos)])

印刷:

192
192
1
0
4

1 回答 1

4

尝试在新的解释器中运行此代码:

>>> cells = [[1, 2, 3], [4, 5, 6]]
>>> [cell for cell in row for row in cells]
NameError: name 'row' is not defined

它适用于您的代码,因为某些东西定义了一个row变量。但是什么?

在 python 2.x中,列表推导会泄漏局部变量(生成器、集合和字典推导,或 3 的列表推导,不会)

在下面的:

>>> [cell for row in cells for cell in row]
[1, 2, 3, 4, 5, 6]
>>> row
[4, 5, 6]
>>> cell
6

cellrow添加到本地范围。当您运行下一个测试用例时,您无意中使用了这个旧值row

>>> [cell for cell in row for row in cells ]
[4, 4, 5, 5, 6, 6]

这仅适用于 python 2.x中的列表推导。

避免被这种情况所困扰的一种方法是使用list(... for x in ...)而不是[... for x in ...].

于 2013-08-11T18:34:37.690 回答