Dengan Python (saya hanya memeriksa dengan Python 3.6 tetapi saya yakin itu harus berlaku untuk banyak versi sebelumnya juga):
(0, 0) == 0, 0 # results in a two element tuple: (False, 0)
0, 0 == (0, 0) # results in a two element tuple: (0, False)
(0, 0) == (0, 0) # results in a boolean True
Tapi:
a = 0, 0
b = (0, 0)
a == b # results in a boolean True
Mengapa hasilnya berbeda antara kedua pendekatan tersebut? Apakah operator persamaan menangani tupel secara berbeda?
sumber
,
mengikat kurang dari==
.Apa yang Anda lihat di semua 3 contoh adalah konsekuensi dari spesifikasi tata bahasa, dan bagaimana token yang ditemukan dalam kode sumber diurai untuk menghasilkan pohon parse.
Melihat kode tingkat rendah ini akan membantu Anda memahami apa yang terjadi di balik terpal. Kita dapat mengambil pernyataan python ini, mengubahnya menjadi kode byte dan kemudian mendekompilasinya menggunakan
dis
modul:Kasus 1:
(0, 0) == 0, 0
(0, 0)
pertama kali dibandingkan dengan yang0
pertama dan dievaluasiFalse
. Sebuah tupel kemudian dibangun dengan hasil ini dan yang terakhir0
, jadi Anda dapatkan(False, 0)
.Kasus 2:
0, 0 == (0, 0)
Sebuah tupel dibangun dengan
0
sebagai elemen pertama. Untuk elemen kedua, pemeriksaan yang sama dilakukan seperti pada kasus pertama dan dievaluasiFalse
, sehingga Anda mendapatkan(0, False)
.Kasus 3:
(0, 0) == (0, 0)
Di sini, seperti yang Anda lihat, Anda hanya membandingkan kedua
(0, 0)
tupel itu dan kembaliTrue
.sumber
Cara lain untuk menjelaskan masalah: Anda mungkin sudah familiar dengan kamus literal
dan literal array
dan literal tupel
tapi yang tidak Anda sadari adalah, tidak seperti kamus dan literal array, tanda kurung yang biasanya Anda lihat di sekitar literal tupel bukanlah bagian dari sintaks literal . Sintaks literal untuk tupel hanyalah urutan ekspresi yang dipisahkan oleh koma:
(sebuah "exprlist" dalam bahasa tata bahasa formal untuk Python ).
Sekarang, apa yang Anda harapkan dari array literal
untuk mengevaluasi? Itu mungkin terlihat lebih seperti seharusnya sama
yang tentu saja bernilai
[0, False]
. Demikian pula, dengan literal tupel yang diberi tanda kurung secara eksplisittidak mengherankan untuk mendapatkannya
(0, False)
. Tetapi tanda kurung bersifat opsional;adalah hal yang sama. Dan itulah mengapa Anda mendapatkannya
(0, False)
.Jika Anda bertanya-tanya mengapa tanda kurung di sekitar literal tupel bersifat opsional, itu sebagian besar karena akan menjengkelkan jika harus menulis tugas yang merusak seperti itu:
sumber
Menambahkan beberapa tanda kurung di sekitar urutan tindakan dilakukan dapat membantu Anda memahami hasil dengan lebih baik:
Koma digunakan untuk memisahkan ekspresi (menggunakan tanda kurung kita dapat memaksa perilaku yang berbeda, tentunya). Saat melihat cuplikan yang Anda daftarkan, koma
,
akan memisahkannya dan menentukan ekspresi apa yang akan dievaluasi:Tupel
(0, 0)
juga dapat dipecah dengan cara yang sama. Koma memisahkan dua ekspresi yang terdiri dari literal0
.sumber
Yang pertama Python membuat tupel dari dua hal:
(0, 0) == 0
, yang mengevaluasi keFalse
0
Yang kedua adalah sebaliknya.
sumber
lihat contoh ini:
kemudian hasilnya:
kemudian perbandingan hanya dilakukan pada bilangan pertama (0 dan r) pada contoh.
sumber