Những gì bạn thấy trong cả 3 trường hợp là kết quả của đặc điểm ngữ pháp của ngôn ngữ và cách các mã thông báo gặp trong mã nguồn được phân tích cú pháp để tạo cây phân tích cú pháp.
Xem qua mã cấp thấp này sẽ giúp bạn hiểu những gì xảy ra bên dưới. Chúng tôi có thể lấy các câu lệnh python này, chuyển đổi chúng thành mã byte và sau đó dịch ngược chúng bằng cách sử dụng dis
mô-đun:
Trường hợp 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)
được so sánh đầu tiên với 0
đầu tiên và được đánh giá với False
. Một bộ tuple sau đó được xây dựng với kết quả này và cuối cùng 0
, vì vậy bạn sẽ nhận được (False, 0)
.
Trường hợp 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
Một tuple được xây dựng bằng 0
phần tử đầu tiên. Đối với phần tử thứ hai, việc kiểm tra tương tự được thực hiện như trong trường hợp đầu tiên và được đánh giá False
, vì vậy bạn nhận được (0, False)
.
Trường hợp 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
Ở đây, như bạn thấy, bạn chỉ cần so sánh hai (0, 0)
bộ giá trị đó và quay trở lại True
.