Ketika saya melihat jawaban untuk pertanyaan ini , saya menemukan saya tidak mengerti jawaban saya sendiri.
Saya tidak begitu mengerti bagaimana ini diurai. Mengapa contoh kedua mengembalikan 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
Terima kasih atas bantuannya. Saya pikir saya harus kehilangan sesuatu yang sangat jelas.
Saya pikir ini agak berbeda dengan duplikat yang ditautkan:
Mengapa ekspresi 0 <0 == 0 mengembalikan False in Python? .
Kedua pertanyaan tersebut berkaitan dengan pemahaman manusia tentang ekspresi. Tampaknya ada dua cara (dalam pikiranku) untuk mengevaluasi ekspresi. Tentu saja tidak ada yang benar, tetapi dalam contoh saya, interpretasi terakhir tidak mungkin.
Melihat 0 < 0 == 0
Anda dapat membayangkan setiap bagian dievaluasi dan masuk akal sebagai ungkapan:
>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True
Jadi tautan menjawab mengapa ini mengevaluasi False
:
>>> 0 < 0 == 0
False
Tetapi dengan contoh saya 1 in ([1,0] == True)
tidak masuk akal sebagai ungkapan, jadi alih-alih ada dua kemungkinan penafsiran, hanya satu yang tampaknya mungkin:
>>> (1 in [1,0]) == True
sumber
==
ikatan lebih ketat daripadain
, jadi[1,0] == True
dievaluasi dulu, lalu hasilnya diumpankan ke1 in other_result
.Jawaban:
Python sebenarnya menerapkan chaining operator perbandingan di sini. Ekspresi diterjemahkan ke
yang jelas
False
.Ini juga terjadi untuk ekspresi seperti
yang diterjemahkan menjadi
(tanpa mengevaluasi
b
dua kali).Lihat dokumentasi bahasa Python untuk perincian lebih lanjut.
sumber
1 in [1, 0] == [1, 0]
dievaluasi menjadiTrue
.in
operator memiliki prioritas lebih tinggi daripada operator perbandingan lainnya dan tidak berantai. Tapi mungkin saya melewatkan use case.in
- setelah semuax < y < z
masuk akal, tetapi tidak begitu banyak denganx in y in z
in
ini tidak lagi terjadi dan membuatnya cukup kontra-intuitif.