Apakah itu dijamin False == 0
dan True == 1
, dengan Python (dengan asumsi bahwa mereka tidak dipindahkan oleh pengguna)? Misalnya, apakah dengan cara apa pun dijamin bahwa kode berikut akan selalu menghasilkan hasil yang sama, apa pun versi Python (baik yang ada dan, kemungkinan, yang akan datang)?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
Referensi apa pun ke dokumentasi resmi akan sangat dihargai!
Sunting : Sebagaimana dicatat dalam banyak jawaban, bool
mewarisi dari int
. Pertanyaan karena itu dapat disusun kembali sebagai: "Apakah dokumentasi secara resmi mengatakan bahwa programmer dapat mengandalkan boolean yang diwarisi dari bilangan bulat, dengan nilai 0
dan1
?". Pertanyaan ini relevan untuk menulis kode yang kuat yang tidak akan gagal karena detail implementasi!
python
boolean
equality
language-specifications
Eric O Lebigot
sumber
sumber
sum(bool_list)
. Kalau tidak, Anda harus menulissum(1 for x bool_list if x)
.bool_list.count(True)
lebih eksplisit; itu juga sekitar 3 kali lebih cepat ... :)Jawaban:
Dalam Python 2.x ini tidak dijamin karena mungkin
True
danFalse
akan dipindahkan. Namun, bahkan jika ini terjadi, boolean True dan boolean False masih dikembalikan dengan benar untuk perbandingan.Dalam Python 3.x
True
danFalse
merupakan kata kunci dan akan selalu sama dengan1
dan0
.Dalam keadaan normal di Python 2, dan selalu dalam Python 3:
False
objek adalah tipebool
yang merupakan subkelas dariint
:Ini adalah satu-satunya alasan mengapa dalam contoh Anda,
['zero', 'one'][False]
bekerja. Itu tidak akan bekerja dengan objek yang bukan subkelas integer, karena pengindeksan daftar hanya bekerja dengan integer, atau objek yang mendefinisikan__index__
metode (terima kasih mark-dickinson ).Edit:
Ini berlaku untuk versi python saat ini, dan versi Python 3. Dokumen untuk python 2.6 dan dokumen untuk Python 3 keduanya mengatakan:
dan di subbagian boolean:
Ada juga, untuk Python 2 :
Jadi boolean secara eksplisit dianggap sebagai bilangan bulat dalam Python 2.6 dan 3.
Jadi Anda aman sampai Python 4 datang. ;-)
sumber
__index__
metode dapat digunakan sebagai indeks daftar; bukan hanya subkelasint
ataulong
.a = True; True = 'i am an idiot'; a == True
=> Salah. Selain penugasan kembali seperti itu, nilai-nilai standar distandarisasi sebagai 0 dan 1, dan saya percaya itu adalah praktik umum untuk bergantung pada itu; misalnya untuk mengindeks ke dalam array dua elemen, di mana [0] menyimpan kasus salah, [1] benar.Tautan ke PEP yang membahas jenis bool baru dengan Python 2.3: http://www.python.org/dev/peps/pep-0285/ .
Saat mengonversi bool ke int, nilai integer selalu 0 atau 1, tetapi saat mengubah int ke bool, nilai boolean bernilai True untuk semua bilangan bulat kecuali 0.
sumber
Dalam Python 2.x, tidak dijamin sama sekali:
Jadi itu bisa berubah. Dalam Python 3.x, True, False, dan None adalah kata-kata yang dicadangkan , sehingga kode di atas tidak akan berfungsi.
Secara umum, dengan boolean Anda harus mengasumsikan bahwa sementara False akan selalu memiliki nilai integer 0 (selama Anda tidak mengubahnya, seperti di atas), True dapat memiliki nilai lain. Saya tidak akan selalu bergantung pada jaminan apa pun itu
True==1
, tetapi pada Python 3.x, ini akan selalu menjadi kasusnya, apa pun yang terjadi.sumber
Sangat sederhana. Karena bool berhubungan dengan mengevaluasi integer sebagai bool, HANYA nol memberikan jawaban yang salah. SEMUA nilai-nilai Nol, mengapung, bilangan bulat, termasuk angka negatif, atau apa pun yang Anda miliki, akan kembali benar.
Contoh yang bagus mengapa ini berguna adalah menentukan status daya perangkat. Nyala adalah nilai bukan nol, off adalah nol. Berbicara secara elektronik ini masuk akal.
Untuk menentukan benar atau salah relatif antara nilai, Anda harus memiliki sesuatu untuk membandingkannya. Hal ini berlaku untuk string dan nilai-nilai nomor, menggunakan
==
atau!=
atau<
,>
>=
,<=
, dllAnda bisa menetapkan integer ke variabel dan kemudian mendapatkan benar atau salah berdasarkan nilai variabel itu.
sumber
Cukup tulis
int(False)
dan Anda akan dapatkan0
, jika Anda mengetiknyaint(True)
akan ditampilkan1
sumber
int()
, dengan makna numerik sederhana, bukan bahwa mereka persis identik dengan 0 dan 1.Salah adalah omong kosong. Ini memiliki tipe yang berbeda. Ini adalah objek yang berbeda dari 0 yang merupakan bilangan bulat.
0 == False
mengembalikan True karena False dilemparkan ke integer. int (Salah) mengembalikan 0Dokumentasi python dari operator == mengatakan (bantuan ('==')):
Sebagai akibatnya, False dikonversi menjadi integer untuk keperluan perbandingan. Tetapi berbeda dari 0.
sumber
bool
adalah subkelas dariint
, jadi dalam arti yang sangat nyata, bool adalah bilangan bulat. Misalnya,isinstance(True, int)
mengembalikan True. Dan pemeriksaan kesetaraan tidak mengubah bool menjadi int, karena tidak ada konversi yang diperlukan: ia hanya memanggilint.__cmp__
langsung. Catatan yangbool.__cmp__ is int.__cmp__
juga dievaluasi untukTrue
.isinstance(True, int)
=> Benar. Yaitu, True IS integer, dan tidak memerlukan konversi.while response is False
berhasil, danwhile response == False
tidak .. Terima kasih!0 is False
tidak benar memberitahumu apa-apa. Di penerjemah interaktif Anda, masukkanx = -10
, laluy = -10
, lalux is y
dan itu juga akan salah. Hanya karena ada optimisasi di tempat di mana juru bahasa Python menggunakan kembali objek integer yang sama dalam keadaan tertentu (menyimpan literer integer sebagai konstanta, menginternir integer kecil) tidak berarti yangis
harus digunakan ketika Anda ingin menguji kesetaraan nilai integer .