Python WTF2: スコープ
Pythonのスコーピングルールでよくつまづく。これはwtfよいうよりGotchaだな…
list comprehension内の変数が、外のを上書き
item="hoge"
foos=[ "foo"+str(item) for item in range(5) ]
print item
for item in items: でも同じだと思う。Python3だとこうならないらしい。
4
不意の束縛
こういうの許してほしくないな~
def foo():
print itemif __name__=='__main__':
for item in range(5):
foo()
これはループの中にベタベタとコードを書いた後でリファクターするときにやってしまう。ループのボディーを切って関数の中に入れる。ループの変数を引数としていないが動いてしまう。別のコンテキストでfoo()を使って始めてitemがフリーなのに気づく。
0
1
2
3
4
import scope3
scope3.foo()
# NameError: global name 'item' is not defined