Kiedy szukałem odpowiedzi na to pytanie , stwierdziłem, że nie rozumiem własnej odpowiedzi.
Naprawdę nie rozumiem, jak to jest analizowane. Dlaczego drugi przykład zwraca False?
>>> 1 in [1,0] # This is expected
True
>>> 1 in [1,0] == True # This is strange
False
>>> (1 in [1,0]) == True # This is what I wanted it to be
True
>>> 1 in ([1,0] == True) # But it's not just a precedence issue!
# It did not raise an exception on the second example.
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable
Dzięki za wszelką pomoc. Myślę, że brakuje mi czegoś naprawdę oczywistego.
Myślę, że różni się to nieco od połączonego duplikatu:
Dlaczego wyrażenie 0 <0 == 0 zwraca False w Pythonie? .
Obydwa pytania dotyczą ludzkiego zrozumienia wyrażenia. Wydawało się, że istnieją dwa sposoby (moim zdaniem) oceny wyrażenia. Oczywiście żadne z nich nie było poprawne, ale w moim przykładzie ostatnia interpretacja jest niemożliwa.
Patrząc na 0 < 0 == 0
ciebie, możesz sobie wyobrazić, że każda połowa jest oceniana i ma sens jako wyrażenie:
>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True
Tak więc link odpowiada, dlaczego to ocenia False
:
>>> 0 < 0 == 0
False
Ale z moim przykładem 1 in ([1,0] == True)
nie ma sensu jako wyrażenie, więc zamiast dwóch (co prawda błędnych) możliwych interpretacji, tylko jedna wydaje się możliwa:
>>> (1 in [1,0]) == True
źródło
==
powiązania są mocniejsze niżin
, więc[1,0] == True
jest oceniane jako pierwsze, a następnie wynik tego jest podawany1 in other_result
.Odpowiedzi:
W rzeczywistości Python stosuje tutaj łańcuchowanie operatorów porównania. Wyrażenie jest tłumaczone na
co oczywiście jest
False
.Dzieje się tak również w przypadku wyrażeń takich jak
co przekłada się na
(bez oceniania
b
podwójnej ).Więcej informacji można znaleźć w dokumentacji języka Python .
źródło
1 in [1, 0] == [1, 0]
ocenia doTrue
.in
operator miał wyższy priorytet niż inne operatory porównania, a nie łańcuch. Ale być może brakuje mi przypadku użycia.in
- w końcux < y < z
ma to sens, ale nie tak bardzo zx in y in z
in
prostu nie ma już miejsca i sprawia, że jest to dość sprzeczne z intuicją.