我有一个可以简化为此代码示例的函数:
def test_fun():
for i in range(17):
item = i
print(item)
for i in range(42):
items = [[i], [i], [i]]
flatten_items = [item[0] for item in items]
print(flatten_items)
当我运行pyflakes(1.3.0)或flake8(3.2.0)时,我收到以下报告:
/tmp/test.py:7:38: F812 list comprehension redefines 'item' from line 3
我看到item
变量确实使用了两次,但是在不同的范围内,所以不应该报告,对吧?
此外,即使没有第二个循环,我也不应该被允许重写item
变量,因为我已经完成了我在第3行定义的变量,因为{{1} }?
那么,这是误报,还是我真的写了一段很差的代码?
答案 0 :(得分:2)
Python 2.7中的列表理解将局部变量泄漏到封闭范围。
for (int i=0; i<=y-x; i++) {
for (int j=0; j<n; j++) {
// something
}
}
此行为已在Python 3中修复:
>>> import sys; sys.version_info
sys.version_info(major=2, minor=7, micro=12, releaselevel='final', serial=0)
>>> [item for item in ['a', 'b', 'c']]
['a', 'b', 'c']
>>> item
'c'