リスト内包表記のスコープ


テストが通ったり通らなかったりする、変な不具合があったので原因を調べていたら、リスト内包表記のカウンタ変数が、外側のローカル変数を上書いてしまっていたのが原因でした。

def test_method(x):
    print(x)
    [x for x in range(10)]
    print(x)

test_method('hello')
# => hello
# => 9

調べたら有名な話みたいですね。python3ではこの挙動は修正されてるようです。