Pertanyaan Operator Python di (__contains__) mengembalikan bool yang nilainya bukan True atau False


Seperti yang diharapkan, 1 tidak terkandung oleh tuple kosong

>>> 1 in ()
False

tetapi False nilai yang dikembalikan tidak sama dengan False

>>> 1 in () == False
False

Melihatnya dengan cara lain, in operator mengembalikan a bool yang bukan keduanya True maupun False:

>>> type(1 in ())
<type 'bool'>
>>> 1 in () == True, 1 in () == False
(False, False)

Namun, perilaku normal akan kembali jika ungkapan asli dikesampingkan

>>> (1 in ()) == False
True

atau nilainya disimpan dalam variabel

>>> value = 1 in ()
>>> value == False
True

Perilaku ini diamati di kedua Python 2 dan Python 3.

Bisakah Anda menjelaskan apa yang sedang terjadi?


32
2017-11-03 09:38


asal


Jawaban:


Anda menjalankan perbandingan operator rantai; 1 in () == False tidak tidak berarti (1 in ()) == False.

Sebaliknya, perbandingan dirantai dan ekspresinya benar-benar berarti:

(1 in ()) and (() == False)

Karena (1 in ()) sudah salah, paruh kedua dari ekspresi dirantai diabaikan sama sekali (sejak False and something_else kembali False berapapun nilainya something_else akan menjadi).

Lihat dokumentasi ekspresi perbandingan:

Perbandingan dapat dirantai secara sewenang-wenang, misalnya, x < y <= z setara dengan x < y and y <= z, kecuali itu y hanya dievaluasi sekali (tetapi dalam kedua kasus z tidak dievaluasi sama sekali saat x < y ditemukan salah).

Untuk catatan, <, >, ==, >=, <=, !=, is, is not, in dan not in semua operator perbandingan (seperti yang sudah ditinggalkan <>).

Secara umum, jangan bandingkan dengan boolean; hanya menguji ekspresi itu sendiri. Jika kamu memiliki untuk menguji terhadap literal boolean, setidaknya menggunakan tanda kurung dan is operator, True dan False adalah lajang, sama seperti None:

>>> (1 in ()) is False
True

Ini semakin membingungkan ketika integer terlibat. The Python bool type adalah subclass dari int1. Dengan demikian, False == 0 itu benar, apa adanya True == 1. Anda dapat membuat operasi dirantai yang hampir terlihat waras:

3 > 1 == True

itu benar karena 3 > 1 dan 1 == True keduanya benar. Tetapi ungkapan:

3 > 2 == True

salah, karena 2 == True salah.

1  bool adalah subkelas dari int untuk alasan bersejarah; Python tidak selalu memiliki bool jenis dan bilangan bulat yang berlebihan dengan makna boolean seperti halnya C. Membuat bool subclass membuat kode lama berfungsi.


45
2017-11-03 09:41