Ich mag dieses Verhalten nicht, aber so funktioniert Python nun einmal. Die Frage wurde bereits von anderen beantwortet, aber lassen Sie mich der Vollständigkeit halber darauf hinweisen, dass Python 2 noch mehr solcher Macken hat.
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 gibt einen Fehler zurück:
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 sieht die f
wird als lokale Variable verwendet in [f for f in [1, 2, 3]]
und beschließt, dass es sich auch um eine lokale Variable in f(3)
. Sie könnten eine global f
Erklärung:
def f(x):
return x
def main():
global f
print f(3)
if (True):
print [f for f in [1, 2, 3]]
main()
Es funktioniert jedoch, f wird am Ende zu 3... Das heißt, print [f for f in [1, 2, 3]]
ändert nun die globale Variable f
zu 3
Es handelt sich also nicht mehr um eine Funktion.
Glücklicherweise funktioniert es in Python3, nachdem man die Klammern zu print
.