Saya punya program Python di mana dua variabel diatur ke nilai 'public'
. Dalam ekspresi bersyarat saya memiliki perbandingan var1 is var2
yang gagal, tetapi jika saya mengubahnya var1 == var2
kembali True
.
Sekarang jika saya membuka interpreter Python saya dan melakukan perbandingan "is" yang sama, itu berhasil.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Apa yang kulewatkan di sini?
input = raw_input("Decide (y/n): ")
. Dalam hal ini input "y" danif input == 'y':
akan mengembalikan "True" sementaraif input is 'y':
akan mengembalikan False.Jawaban:
is
adalah pengujian identitas,==
adalah pengujian kesetaraan. apa yang terjadi dalam kode Anda akan ditiru dalam bahasa juru bahasa seperti ini:jadi, tidak heran mereka tidak sama, kan?
Dengan kata lain:
is
is theid(a) == id(b)
sumber
==
vs.equals()
di Jawa. Bagian terbaiknya adalah bahwa Python==
tidak analog dengan Java==
.None
nilai. Jadi selalu memiliki id yang sama.Jawaban lain di sini benar:
is
digunakan untuk perbandingan identitas , sedangkan==
digunakan untuk perbandingan kesetaraan . Karena yang Anda pedulikan adalah kesetaraan (dua string harus berisi karakter yang sama), dalam hal iniis
operator itu salah dan Anda harus menggunakan==
sebagai gantinya.Alasannya
is
bekerja secara interaktif adalah bahwa (sebagian besar) string literal diinternir secara default. Dari Wikipedia:Jadi, ketika Anda memiliki dua string literal (kata-kata yang secara harfiah diketik ke dalam kode sumber program Anda, dikelilingi oleh tanda kutip) dalam program Anda yang memiliki nilai yang sama, kompiler Python akan secara otomatis menginternasionalkan string, membuat keduanya disimpan pada saat yang sama lokasi memori. (Perhatikan bahwa ini tidak selalu terjadi, dan aturan untuk kapan ini terjadi cukup berbelit-belit, jadi tolong jangan mengandalkan perilaku ini dalam kode produksi!)
Karena dalam sesi interaktif Anda, kedua string sebenarnya disimpan di lokasi memori yang sama, mereka memiliki identitas yang sama , sehingga
is
operator bekerja seperti yang diharapkan. Tetapi jika Anda membangun sebuah string dengan metode lain (bahkan jika string itu mengandung karakter yang persis sama), maka string tersebut mungkin sama , tetapi itu bukan string yang sama - yaitu, ia memiliki identitas yang berbeda , karena itu adalah disimpan di tempat yang berbeda di memori.sumber
==
danis
berdasarkan jenis cek yang Anda inginkan. Jika Anda peduli tentang string yang sama (yaitu, memiliki konten yang sama) maka Anda harus selalu menggunakannya==
. Jika Anda peduli apakah ada dua nama Python yang merujuk ke instance objek yang sama, Anda harus menggunakanis
. Anda mungkin perluis
jika Anda menulis kode yang menangani banyak nilai berbeda tanpa memperhatikan isinya, atau jika Anda tahu hanya ada satu dari sesuatu dan Anda ingin mengabaikan objek lain yang berpura-pura menjadi benda itu. Jika Anda tidak yakin, selalu pilih==
.Kata
is
kunci adalah tes untuk identitas objek sedangkan==
perbandingan nilai.Jika Anda menggunakan
is
, hasilnya akan benar jika dan hanya jika objek tersebut adalah objek yang sama. Namun,==
akan benar setiap saat nilai objek sama.sumber
Satu hal terakhir yang perlu diperhatikan, Anda dapat menggunakan
sys.intern
fungsi untuk memastikan bahwa Anda mendapatkan referensi ke string yang sama:Seperti yang ditunjukkan di atas, Anda tidak boleh menggunakan
is
untuk menentukan kesetaraan string. Tapi ini mungkin berguna untuk mengetahui jika Anda memiliki beberapa persyaratan aneh untuk digunakanis
.Perhatikan bahwa
intern
fungsi yang digunakan adalah builtin pada Python 2 tetapi dipindahkan kesys
modul dengan Python 3.sumber
is
adalah pengujian identitas,==
adalah pengujian kesetaraan. Ini artinya adalahis
cara untuk memeriksa apakah dua hal adalah hal yang sama , atau hanya setara.Katakanlah Anda punya
person
objek sederhana . Jika diberi nama 'Jack' dan '23' tahun, itu setara dengan Jack lain yang berusia 23 tahun, tetapi itu bukan orang yang sama.Mereka seusia, tapi mereka bukan orang yang sama. Sebuah string mungkin setara dengan yang lain, tetapi itu bukan objek yang sama.
sumber
jack1.age = 99
, itu tidak akan berubahjack2.age
. Itu karena mereka adalah dua contoh yang berbeda, jadijack1 is not jack2
. Namun, mereka dapat sama satu sama lainjack1 == jack2
jika nama dan umur mereka sama. Itu menjadi lebih rumit untuk string, karena string tidak dapat diubah dalam Python, dan Python sering menggunakan kembali contoh yang sama. Saya suka penjelasan ini karena menggunakan case sederhana (objek normal) daripada case khusus (string).Ini adalah catatan tambahan, tetapi dengan python idiomatik, Anda akan sering melihat hal-hal seperti:
Ini aman, karena dijamin ada satu instance dari Objek Null (yaitu, Tidak ada) .
sumber
Jika Anda tidak yakin apa yang Anda lakukan, gunakan '=='. Jika Anda memiliki sedikit pengetahuan tentangnya, Anda dapat menggunakan 'is' untuk objek yang dikenal seperti 'None'.
Kalau tidak, Anda akan bertanya-tanya mengapa hal-hal tidak bekerja dan mengapa ini terjadi:
Saya bahkan tidak yakin apakah beberapa hal dijamin tetap sama antara versi / implementasi python yang berbeda.
sumber
Dari pengalaman saya yang terbatas dengan python,
is
digunakan untuk membandingkan dua objek untuk melihat apakah mereka adalah objek yang sama dengan dua objek berbeda dengan nilai yang sama.==
digunakan untuk menentukan apakah nilainya identik.Ini adalah contoh yang bagus:
s1
adalah string unicode, dans2
merupakan string normal. Mereka bukan tipe yang sama, tetapi memiliki nilai yang sama.sumber
Saya pikir itu ada hubungannya dengan fakta bahwa, ketika perbandingan 'adalah' dievaluasi menjadi false, dua objek berbeda digunakan. Jika bernilai true, itu berarti secara internal ia menggunakan objek yang sama persis dan tidak membuat yang baru, mungkin karena Anda membuatnya dalam fraksi 2 atau lebih detik dan karena tidak ada kesenjangan waktu yang besar di antara dioptimalkan dan menggunakan objek yang sama.
Inilah sebabnya mengapa Anda harus menggunakan operator persamaan
==
, bukanis
, untuk membandingkan nilai objek string.Dalam contoh ini, saya membuat s2, yang merupakan objek string berbeda yang sebelumnya sama dengan 'satu' tetapi bukan objek yang sama dengan
s
, karena penerjemah tidak menggunakan objek yang sama karena saya awalnya tidak menetapkannya ke 'satu', jika saya memilikinya akan membuat mereka menjadi objek yang sama.sumber
.replace()
sebagai contoh dalam konteks ini mungkin bukan yang terbaik, karena semantiknya dapat membingungkan.s2 = s2.replace()
akan selalu membuat objek string baru , menetapkan objek string barus2
, dan kemudian membuang objek string yangs2
digunakan untuk menunjuk. Jadi, bahkan jika Anda melakukannya,s = s.replace('one', 'one')
Anda masih akan mendapatkan objek string baru.Saya percaya bahwa ini dikenal sebagai string "diinternir". Python melakukan ini, begitu pula Java, dan begitu juga C dan C ++ ketika mengkompilasi dalam mode yang dioptimalkan.
Jika Anda menggunakan dua string yang identik, alih-alih membuang-buang memori dengan membuat dua objek string, semua string yang diinternir dengan konten yang sama mengarah ke memori yang sama.
Ini menghasilkan operator "is" Python yang mengembalikan True karena dua string dengan konten yang sama menunjuk ke objek string yang sama. Ini juga akan terjadi di Jawa dan C.
Ini hanya berguna untuk penghematan memori. Anda tidak dapat mengandalkannya untuk menguji kesetaraan string, karena berbagai penterjemah dan kompiler dan mesin JIT tidak selalu dapat melakukannya.
sumber
Saya menjawab pertanyaan meskipun pertanyaannya sudah lama karena tidak ada jawaban di atas yang mengutip referensi bahasa
Sebenarnya operator memeriksa identitas dan == operator memeriksa kesetaraan,
Dari Referensi Bahasa:
Jenis mempengaruhi hampir semua aspek perilaku objek. Bahkan pentingnya identitas objek dipengaruhi dalam beberapa hal: untuk tipe yang tidak dapat diubah, operasi yang menghitung nilai-nilai baru sebenarnya dapat mengembalikan referensi ke objek yang ada dengan tipe dan nilai yang sama, sedangkan untuk objek yang dapat berubah ini tidak diperbolehkan . Misalnya, setelah a = 1; b = 1, a dan b mungkin atau mungkin tidak merujuk ke objek yang sama dengan nilai satu, tergantung pada implementasinya, tetapi setelah c = []; d = [], c dan d dijamin untuk merujuk ke dua daftar kosong yang berbeda, unik, yang baru dibuat. (Perhatikan bahwa c = d = [] menetapkan objek yang sama untuk c dan d.)
jadi dari pernyataan di atas kita dapat menyimpulkan bahwa string yang merupakan tipe tidak berubah mungkin gagal ketika diperiksa dengan "is" dan dapat diperiksa berhasil ketika diperiksa dengan "is"
Hal yang sama berlaku untuk int, tuple yang juga merupakan tipe yang tidak berubah
sumber
The
==
nilai tes Operator kesetaraan. Theis
identitas tes Operator objek, tes Python apakah kedua benar-benar objek yang sama (yaitu, hidup di alamat yang sama di memori).Dalam contoh ini, Python hanya membuat satu objek string, dan keduanya
a
danb
merujuknya. Alasannya adalah bahwa Python secara internal menyimpan dan menggunakan kembali beberapa string sebagai optimisasi, hanya ada string 'pisang' dalam memori, dibagi oleh a dan b; Untuk memicu perilaku normal, Anda perlu menggunakan string yang lebih panjang:Saat Anda membuat dua daftar, Anda mendapatkan dua objek:
Dalam hal ini kita dapat mengatakan bahwa kedua daftar itu setara, karena mereka memiliki elemen yang sama, tetapi tidak identik, karena mereka bukan objek yang sama. Jika dua objek identik, mereka juga setara, tetapi jika mereka setara, mereka tidak harus sama.
Jika
a
merujuk ke objek dan Anda tetapkanb = a
, maka kedua variabel merujuk ke objek yang sama:sumber
is
akan membandingkan lokasi memori. Ini digunakan untuk perbandingan tingkat objek.==
akan membandingkan variabel dalam program. Ini digunakan untuk memeriksa pada level nilai.is
memeriksa kesetaraan tingkat alamat==
memeriksa kesetaraan tingkat nilaisumber
is
adalah pengujian identitas,==
adalah pengujian kesetaraan (lihat Dokumentasi Python ).Dalam kebanyakan kasus, jika
a is b
, makaa == b
. Tetapi ada pengecualian, misalnya:Jadi, Anda hanya dapat menggunakan
is
untuk tes identitas, tidak pernah tes kesetaraan.sumber