Gut, wir sind hier in der Short Circuit-Hölle. Zunächst wird das Programm für beliebige nichtnumerische Argumente abstürzen. Ansonsten spielen nur die ersten beiden Kommandozeilenargumente eine Rolle, und wesentlich verschiedenes verhalten ist auch nur zu erwarten, wenn sich die Argumente logisch unterscheiden, also sagen wir zwischen Nullen und Einsen. Gehen wir die möglichen Fälle durch:

Wenn das Programm gar kein Argument bekommt, scheitert schon der erste Vergleich, womit der Wert des ganzen ersten Teils und damit, weil alles nur mit and verbunden ist, der Wert des ganzen logischen Ausdrucks feststeht: Er ist falsch, es wird also nichts ausgegeben.

Bekommt das Programm eine Null als Argument, wird der zweite Teil des ersten Teilausdrucks ausgewertet, es wird also eine Null ausgegeben. Diese Null macht aber auch den ersten Teilausdruck falsch, so dass der Rest der Bedingung wieder nicht ausgewertet wird.

Übergeben wir hingegen eine eins, ist der erste Teilausdruck wahr und der zweite wird ausgewertet (denn er könnte den ganzen and-Ausdruck noch falsch machen). Das ist in dem Fall auch so, aber weil sys.argv in diesem Fall nicht länger als 2 ist, wird der zweite Teil des or-Ausdrucks auch noch ausgewertet. Er druckt eine Null, gibt diese auch zurück, und falsch oder falsch ist falsch, womit der Wert des gesamten if-Ausdrucks wieder feststeht und der dritte Teilausdruck nicht mehr ausgewertet werden muss.

Bleiben die Fälle mit zwei Argumenten: 0 0 macht den ersten Teilausdruck wegen dessen zweiten Teils falsch, weswegen nichts anderes ausgewertet wird, es wird also nur eine 0 ausgegeben. Der Fall 0 1 ist analog.

Im Fall von 1 0 gibt der erste Teilausdruck eine eins aus und ist wahr, so dass der zweite Teilausdruck ausgewertet wird. Die Bedingung an die Länge von sys.argv ist dieses Mal wahr, so dass der zweite Teil des zweiten Teilausdrucks nicht ausgewertet wird, aber zur Beurteilung des Gesamtausdrucks auch noch der dritte Teilausdruck angesehen werden muss. Er gibt 0 aus und falsch zurück, insgesamt wird also 1 0 ausgegeben.

Übergeben wir 1 1, läuft alles analog, nur ist mit dem dritten Teilausdruck jetzt der gesamte logische Ausdruck wahr. Mithin wird, weil not int(sys.argv[2]) falsch ist, der zweite Teil des or-Ausdrucks im print-Statement ausgewertet und folglich noch eine Null ausgegeben. Die Gesamtausgabe ist also 1 1 0.

Ihr ahnt schon, man will Short Circuit Evaluation eigentlich nicht in nichttrivialer Weie mit Funktionen mit Seiteneffekten kombinieren. Solange es keine Seiteneffekte gibt, macht sie aber Programme schneller, ohne dass irgendwas passiert.