2013-10-22 6 views
5

Ich traf nur die folgenden Hinweise und ist neugierig auf Python Verhalten:Auftrag der Auswertung bei der Prüfung Gleichwertigkeit von booleans

>>> x = 1 
>>> x in range(2) 
True 
>>> type(x in range(2)) 
<type 'bool'> 
>>> x in range(2) == True 
False 
>>> x in range(2) == False 
False 
>>> (x in range(2)) == True 
True 

Insbesondere warum (1 in range(2)) == True bewertet True und l in range(2) == True bewerten zu False? Es scheint, wie es einige seltsame Reihenfolge der Auswertung Verhalten im letzteren ist, mit der Ausnahme, dass, wenn Sie die Bestellung ausdrücklich falsch machen, können Sie eine TypeError erhalten:

>>> x in (range(2) == True) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: argument of type 'bool' is not iterable 

Für das Protokoll, ich kenne keine Fälle, in denen ich würde x in range(2) == True anstatt nur x in range (2) verwenden, würde aber gerne wissen, warum das passiert. Ich habe das auch in Python2.7 und Python3 getestet und das Verhalten ist das gleiche.

Antwort

4

Der folgende Ausdruck:

x in range(2) == True 

ist Vergleich gekettet und wird ausgewertet als:

x in range(2) and range(2) == True 

, die Ihnen False als range(2) == True geben wird False ausgewertet. Siehe Dokumentation Comparison:

Vergleiche gekettet willkürlich werden können, beispielsweise x < y <= z entsprechen x < y and y <= z, mit der Ausnahme, dass y nur einmal ausgewertet wird (in beiden Fällen aber wird z durchaus nicht ausgewertet, wenn x < y gefunden wird, falsch zu sein).

+0

Gute Einsicht! Aus irgendeinem Grund hätte ich nie gedacht, dass du dich mit anderen Operatoren "einhängen" kannst. – mdml

3

Die == Gleichheit und in Mitgliedschaft Betreiber sind beide comparison operators, und diese können gekettet sein.

Die Verkettung hat die Form expr1 op1 expr2 op2 expr3, die als (expr1 op1 expr2) and (expr2 op2 expr3) interpretiert wird, aber die mittlere expr2 wird nur einmal ausgewertet.

Also, Ihre Beispiele sind wirklich:

x in range(2) and range(2) == True 

und range(2) in einen Booleschen Wert nie gleich ist.

Beachten Sie, dass Sie wirklich nie mit == True oder == False vergleichen sollten. Lassen Sie das auf while oder if, um für Sie zu testen.

-1

Ich denke, becuause sind Sie eigentlich nur die range(2) Teil Bewertung, die, wenn Sie es im Interpreter versuchen, erhalten Sie dies.

>>> range(2) == True 
>>> False