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:

python
>>> 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
True

Ekspresi 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:

python
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:

text
False
False
True

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 1-2 (class Tugas:): statement class mendefinisikan cetakan object baru bernama Tugas (sintaks lengkapnya dibahas pada Section Object-Oriented Programming); kata kunci pass menandai tubuh class yang masih kosong.
  2. Baris 4-5 (tugas_a = Tugas()): setiap pemanggilan Tugas() membangun object baru. tugas_a dan tugas_b kini memegang dua object berbeda.
  3. Baris 6 (tugas_c = tugas_a): tidak ada object baru yang dibuat; tugas_c hanya menyalin rujukan sehingga kedua nama menunjuk ke object yang sama.
  4. Baris 8-10 (print(...)): class Tugas tidak mendefinisikan aturan perbandingan isi sendiri, sehingga == jatuh kembali ke perbandingan identitas — hanya tugas_a is tugas_c yang True karena 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:

python
>>> nilai = None
>>> nilai is None
True
>>> nilai is not None
False
>>> angka = 0
>>> angka is None
False
>>> angka == 0
True

Pola 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.