我不喜欢这种行为,但这就是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)中的局部变量。你可以添加一个全局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中添加括号打印后,它可以正常工作。