Dua variabel bisa saja menampung nilai yang sama persis, tetapi pertanyaannya berbeda: apakah keduanya menunjuk ke object yang sama di memori? Operator == dan is menjawab dua pertanyaan berbeda tersebut — == membandingkan isi, is membandingkan identitas. Mencampuradukkan keduanya adalah sumber bug yang halus, dan pada Chapter ini kita akan membedah cara kerjanya secara tuntas.
is vs == #
Operator is menghasilkan True hanya jika kedua operannya merujuk ke object yang sama. Operator == menghasilkan True jika nilainya dianggap sama. Perhatikan dua list berikut:
>>> daftar_a = [1, 2, 3]
>>> daftar_b = [1, 2, 3]
>>> daftar_a == daftar_b
True
>>> daftar_a is daftar_b
False
>>> daftar_a is daftar_a
TrueEkspresi daftar_a == daftar_b bernilai True karena isi kedua list sama. Namun statement daftar_a = [1, 2, 3] dan daftar_b = [1, 2, 3] membuat interpreter Python membangun dua object list terpisah di memori — sama isinya, tetapi bukan object yang sama. Satu-satunya cara is menghasilkan True adalah ketika kedua nama menunjuk ke object identik, seperti daftar_a is daftar_a.
Menguji Identitas dengan Object Buatan Sendiri #
Identitas paling mudah dilihat pada object yang kita buat sendiri. Kode berikut membuat tiga nama: dua object terpisah dan satu nama tambahan yang menunjuk ke object pertama:
class Tugas:
pass
tugas_a = Tugas()
tugas_b = Tugas()
tugas_c = tugas_a
print(tugas_a == tugas_b)
print(tugas_a is tugas_b)
print(tugas_a is tugas_c)Output yang Dihasilkan:
False
False
TrueMari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 1-2 (
class Tugas:): statementclassmendefinisikan cetakan object baru bernamaTugas(sintaks lengkapnya dibahas pada Section Object-Oriented Programming); kata kuncipassmenandai tubuh class yang masih kosong. - Baris 4-5 (
tugas_a = Tugas()): setiap pemanggilanTugas()membangun object baru.tugas_adantugas_bkini memegang dua object berbeda. - Baris 6 (
tugas_c = tugas_a): tidak ada object baru yang dibuat;tugas_chanya menyalin rujukan sehingga kedua nama menunjuk ke object yang sama. - Baris 8-10 (
print(...)): classTugastidak mendefinisikan aturan perbandingan isi sendiri, sehingga==jatuh kembali ke perbandingan identitas — hanyatugas_a is tugas_cyangTruekarena kedua nama menunjuk ke satu object yang sama.
Pola is None #
Satu-satunya kasus umum di mana is adalah pilihan yang tepat adalah pengujian terhadap None. Object None adalah singleton: hanya ada satu object None di seluruh program, sehingga pengujian identitas dijamin dapat diandalkan:
>>> nilai = None
>>> nilai is None
True
>>> nilai is not None
False
>>> angka = 0
>>> angka is None
False
>>> angka == 0
TruePola if nilai is None: menjadi penting karena None sering dipakai sebagai penanda “belum ada nilai”. Perhatikan bahwa angka = 0 dan nilai = None adalah dua keadaan berbeda: 0 adalah nilai angka yang sah, sedangkan None berarti data memang belum tersedia. Detail nilai None dibahas pada Chapter None dan NoneType.
Interning pada CPython #
Terdapat satu perilaku implementasi yang perlu diketahui: interpreter CPython menyimpan cache untuk bilangan bulat kecil (umumnya -5 sampai 256) dan sebagian string pendek. Akibatnya, dua nama yang menampung nilai seperti 100 dapat tanpa sengaja merujuk ke object yang sama, sehingga a is b bisa True meskipun kode kita tidak pernah memaksakannya.
Perilaku ini — disebut interning — adalah detail implementasi, bukan jaminan bahasa. Hasilnya bisa berbeda antar versi Python, antar implementasi (CPython, PyPy), bahkan antar cara penulisan kode.