2012-06-22 14 views
15

Dziś rano znalazłem się pisać coś takiego:Jakie są zasady dotyczące łańcuchowym z „==” i w Pythonie

if (a == b == c): 
    # do something 

i był zaskoczony, że dał mi oczekiwanego rezultatu.

myślałem, że zachowują się jak:

if ((a == b) == c): 
    # do something 

Ale to oczywiście nie. Wydaje się, że Python traktuje pierwsze zdanie inaczej niż drugie, co jest miłe, ale nie mogłem znaleźć żadnej dokumentacji ani wyjaśnienia na ten temat.

Przetestowałem i dostał to:

In [1]: 2 == 2 == 2 
Out[1]: True 

In [2]: (2 == 2) == 2 
Out[2]: False 

Czy ktoś chętny do mnie wyjaśnić, jakie są zasady dotyczące takich "łańcuchowym" z == (lub !=)?

Dziękuję bardzo.

+3

Formalnie, jeśli a, b, c, ..., y, z są wyrażeniami, a op1, op2, ..., opN są operatorami porównania, to op1 b op2 c ... y opN z jest równoważne op1 b i b op2 c oraz ... y opN z, z tym że każde wyrażenie jest oceniane najwyżej raz. @ http://docs.python.org/reference/expressions.html – georg

+2

Czysty, co nie? Możesz także wykonać 'a Thomas

+0

Nie chodzi o to, że bardzo mnie to obchodzi, ale czy osoba sprowadzająca może wyjaśnić, dlaczego przegłosował? – ereOn

Odpowiedz

24

ta współpracuje ze wszystkimi operatorami porównania - na przykład, można również zrobić:

>>> 4 < 5 < 6 
True 
>>> 4 < 5 !=2 
True 

Ogólnie rzecz biorąc, according to the documentation, a op1 b op2 c gdzie op1 i op2 są którykolwiek: <, >, !=, ==, <=, >=, is, is not, in lub not in da taki sam rezultat jak:

a op1 b and b op2 c 

Docs również powiedzieć, że ten może pracować z dowolnie wieloma porównaniami, więc:

>>> 5 != '5' != 'five' != (3+2) 
True 

Może to być nieco mylący wynik, ponieważ czasami zdaje się mówić: 5 != (3+2) - każdy operand jest porównywany tylko z tymi, które są bezpośrednio do niego przylegające, zamiast wykonywać wszystkie możliwe kombinacje (które mogą nie być jasne w przykładach używających tylko ==, ponieważ nie wpłynie to na odpowiedź, jeśli wszystko definiuje sanely __eq__).

+0

Działa również dla 'in' i' not in', np.'4 w [4] w [[4]]' (nie to, że polecam to użycie ...) – interjay

+0

@interjay i rzeczywiście tak naprawdę edytowałem te w mojej odpowiedzi, kiedy pojawił się twój komentarz. GMTA. :-) – lvc

+1

Dziękuję bardzo za wyjaśnienia. Moja miłość do tego języka rośnie z dnia na dzień! ;) – ereOn

12

O ile wiem przykładem wskazałeś nie łańcuchowym.

2 == 2 == 2 jest jak (2 == 2) and (2 == 2) który okazuje się być True and True

podczas

(2 == 2) == 2 jest jak (True) == 2

Powiązane problemy