Python WTF2: スコープ

Pythonのスコーピングルールでよくつまづく。これはwtfよいうよりGotchaだな…

list comprehension内の変数が、外のを上書き


item="hoge"
foos=[ "foo"+str(item) for item in range(5) ]
print item

4
for item in items: でも同じだと思う。Python3だとこうならないらしい。

不意の束縛


def foo():
print item

if __name__=='__main__':
for item in range(5):
foo()

こういうの許してほしくないな~

0
1
2
3
4
これはループの中にベタベタとコードを書いた後でリファクターするときにやってしまう。ループのボディーを切って関数の中に入れる。ループの変数を引数としていないが動いてしまう。別のコンテキストでfoo()を使って始めてitemがフリーなのに気づく。

import scope3
scope3.foo()
# NameError: global name 'item' is not defined