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
>>> dis.dis(compile("(0, 0) == 0, 0", '', 'exec'))
1 0 LOAD_CONST 2 ((0, 0))
3 LOAD_CONST 0 (0)
6 COMPARE_OP 2 (==)
9 LOAD_CONST 0 (0)
12 BUILD_TUPLE 2
15 POP_TOP
16 LOAD_CONST 1 (None)
19 RETURN_VALUE
(0, 0)
pertama kali dibandingkan dengan yang 0
pertama dan dievaluasi False
. Sebuah tupel kemudian dibangun dengan hasil ini dan yang terakhir 0
, jadi Anda dapatkan (False, 0)
.
Kasus 2: 0, 0 == (0, 0)
>>> dis.dis(compile("0, 0 == (0, 0)", '', 'exec'))
1 0 LOAD_CONST 0 (0)
3 LOAD_CONST 0 (0)
6 LOAD_CONST 2 ((0, 0))
9 COMPARE_OP 2 (==)
12 BUILD_TUPLE 2
15 POP_TOP
16 LOAD_CONST 1 (None)
19 RETURN_VALUE
Sebuah tupel dibangun dengan 0
sebagai elemen pertama. Untuk elemen kedua, pemeriksaan yang sama dilakukan seperti pada kasus pertama dan dievaluasi False
, sehingga Anda mendapatkan (0, False)
.
Kasus 3: (0, 0) == (0, 0)
>>> dis.dis(compile("(0, 0) == (0, 0)", '', 'exec'))
1 0 LOAD_CONST 2 ((0, 0))
3 LOAD_CONST 3 ((0, 0))
6 COMPARE_OP 2 (==)
9 POP_TOP
10 LOAD_CONST 1 (None)
13 RETURN_VALUE
Di sini, seperti yang Anda lihat, Anda hanya membandingkan kedua (0, 0)
tupel itu dan kembali True
.