Hallo Jan,
Voges hat geschrieben:
Es gibt die Regel, dass Zuweisungen immer lokale Namen erzeugen, aber - Achtung, jetzt kommt es! - diese Erzeugung des lokalen Namens geschieht nicht erst beim Aufruf der Funktion, sondern schon vorab beim Kompilieren. Das heißt, wenn Du foo() aufrufst, existiert bereits die Information, dass es ein lokales x gibt und print x erzeugt einen Fehler, da dem x noch kein Wert zugewiesen wurde.
Jan
Danke für die Beschreibung, das war mir bisher gar nicht so klar. Ich habe noch ein bißchen gespielt: Wenn man die Zuweisung hinter einer Abfrage versteckt, wird das Verhalten noch undurchschaubarer:
Das funktioniert, weil der Compiler offensichtlich die Zuweisung wegoptimiert. Ersetze ich aber die Null durch ein None, gibt es den oben beschriebenen Fehler. Der Zweig wird nicht wegoptimiert, weil ich den Namen "None" dann noch überschreiben dürfte, nehme ich jedenfalls an.
Aber: Eine leere Liste "[]" statt der Null führt auch zum Fehler, und diese ist nun mal konstant "unwahr", wie eine Null, nur merkt der Compiler das hier wohl nicht.
Irgendwie gefällt mir das Verhalten von Python an der Stelle nicht!
Jörg