2016-04-23 7 views
1

Kann mir jemand erklären, warum:Spezifische der Pythons if/else einzeiler Argument Substitution

>>> print 1,2 if 0 else 3,4 
1 3 4 

aber:

>>> print(1,2) if 0 else 3,4 
3 4 

oder vielleicht ist dies nicht mit diesem Zustand überhaupt zusammen?

+8

Da die ersten ist 'drucken 1, (2, wenn 0, sonst 3), 4' und die zweite ist 'print ((1, 2) wenn 0 sonst 3), 4 '- siehe https://docs.python.org/2/reference/expressions.html#operator-precedence und https://docs.python.org /2/library/stdtypes.html#truth-value-testing. Es ist nicht klar, welchen Teil Sie überraschend finden. – jonrsharpe

+1

Aus diesem Grund sollten Sie mit Klammern drucken. Um solche Verwirrung zu vermeiden. –

Antwort

0

Zitiert docs:

drucken jeden Ausdruck wiederum wertet und schreibt das resultierende Objekt auf der Standardausgabe.

Also müssen wir nur herausfinden, dass diese Ausdrücke in Ihrem Fall sind.

print 1,2 if 0 else 3,4 entspricht print 1, (2 if 0 else 3), 4. print-Anweisung erhält drei "Argumente", erste und dritte sind konstante Ausdruck, zweite enthält ternäre Anweisung.

print(1,2) if 0 else 3,4 entspricht Drucken (1,2) if 0 else 3, 4. print-Anweisung empfängt zwei "Argumente", enthält zuerst ternäre Anweisung, zweite ist konstanter Ausdruck.

1

Ihr erstes Beispiel gibt drei Elemente print, die durch Kommata getrennt sind:

1 
2 if 0 else 3 
4 

Sie könnten die Klammern an verschiedenen Orten setzen und das gleiche Ergebnis:

print 1, (2 if 0 else 3), 4 

Wenn Sie möchten, Haben Sie das Tupelverhalten, können Sie dort Klammern verwenden:

print (1, 2) if 0 else (3, 4) 

Das Problem besteht natürlich darin, dass es als Tupel und nicht als separate Argumente ausgegeben wird. Wirklich, ist das Beste, was entweder from __future__ import print_function verwenden und print(*((1, 2) if 0 else (3, 4))) oder einen ganzen if zu haben - else Block:

if 0: 
    print 1, 2 
else: 
    print 3, 4