2

このコード サンプルに簡略化できる関数があります。

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変数が実際に2回使用されていることですが、スコープが異なるため、報告されるべきではありませんよね?

また、2 番目のループがなかったitemとしても、3 行目で定義したprint?

それで、これは偽陽性ですか、それとも私は本当に非常に貧弱なコードを書いていますか?

4

1 に答える 1

2

Python 2.7 のリスト内包表記は、ローカル変数を外側のスコープにリークします。

>>> 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'

この動作は Python 3 で修正されました。

>>> import sys; sys.version_info
sys.version_info(major=3, minor=5, micro=2, releaselevel='final', serial=0)
>>> [item for item in ['a', 'b', 'c']]
['a', 'b', 'c']
>>> item
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'item' is not defined
于 2016-11-17T11:16:46.033 に答える