2016-06-30 7 views
0

In meinem Programm begegnet mit diesem:Wie funktioniert die Kette von `und` Operatoren in Python?

>>> True and True and (3 or True) 
3 

>>> True and True and ('asd' or True) 
'asd' 

, während ich in Klammern auf das Ergebnis etwas boolean Wert abhängig erhalten erwartet. Also, wenn ich versuche, Vergleiche wie diese (0 or True) oder ('' or True) Python wird True, die klar ist, weil 0 und '' entspricht False in Vergleichen.

Warum gibt Python keinen booleschen Wert zurück, indem 3 und 'asd' in True konvertiert werden?

+0

Sind Sie fragen * was * 'und' tut, oder warum * konvertiert * das Ergebnis nicht automatisch in einen booleschen Wert? – user2357112

+0

Auch das Einfügen von '(0 oder True)' oder '('' oder True)' hätte Ihnen 'False' nicht gegeben. Du hättest "True" bekommen. – user2357112

+0

@ user2357112 ja, mein dummer Fehler. Aktualisiert. Bezüglich der Frage - ich war ein bisschen verwirrt, wie man es richtig stellt. Aber die Antwort unten klärt dieses Ding trotzdem – AmirM

Antwort

2

Von https://docs.python.org/3/library/stdtypes.html:

Wichtige Ausnahme: die Boolesche Operationen oder und und immer Rückkehr einer ihrer Operanden

Das Verhalten am leichtesten werden kann mit gesehen:

>>> 3 and True 
True 

>>> True and 3 
3 

Wenn Sie dieses Verhalten beseitigen müssen, wickeln Sie es in einem Bool:

>>> bool(True and 3) 
True 

Siehe this question

Als Reut Sharabani, beantwortet ermöglicht dieses Verhalten nützliche Dinge wie:

>>> my_list = [] 
>>> print (my_list or "no values") 
+0

Andere überraschende und alberne Dinge: Dank Ineffizienzen in eingebauten Namenssuche und Funktionsaufrufen im Vergleich zu Syntax-basierten Operationen ist 'not not x' eine schnellere Möglichkeit, von truthy/falsy in' True' zu ​​konvertieren und 'Falsch' als' bool (x) '. Nicht, dass ich das wirklich empfehle, außer du bist wirklich auf Zyklen bedacht und es ist der heißeste Teil deines Codes. Die schnellste Lösung besteht darin, den Truthy- und Falsy-Wert direkt ohne Konvertierung zu verwenden. – ShadowRanger