私はこの振る舞いが好きではありませんが、これが Python のしくみです。この質問は他の人によってすでに回答されていますが、完全を期すために、Python 2 にはそのような癖があることを指摘しておきます。
def f(x):
return x
def main():
print f(3)
if (True):
print [f for f in [1, 2, 3]]
main()
Python 2.7.6 はエラーを返します。
Traceback (most recent call last):
File "weird.py", line 9, in <module>
main()
File "weird.py", line 5, in main
print f(3)
UnboundLocalError: local variable 'f' referenced before assignment
Python は、f
が でローカル変数として使用されている[f for f in [1, 2, 3]]
ことを確認し、 でローカル変数でもあると判断しますf(3)
。global f
次のステートメントを追加できます。
def f(x):
return x
def main():
global f
print f(3)
if (True):
print [f for f in [1, 2, 3]]
main()
それは機能します。しかし、f は最後に 3 になります...つまりprint [f for f in [1, 2, 3]]
、グローバル変数f
が に変更さ3
れるため、関数ではなくなります。
幸いなことに、括弧を に追加した後、Python3 で問題なく動作しprint
ます。