2015-07-11 31 views
26

Tại sao nó rằng các báo cáo hoạt động như mong đợi khi dấu ngoặc được sử dụng:Tại sao `Đúng là Sai == Sai`, Sai bằng Python?

>>> (True is False) == False 
True 

>>> True is (False == False) 
True 

Nhưng nó trả False khi không có dấu ngoặc?

>>> True is False == False 
False 
+3

Dường như bạn đã vào một trong số ít các góc tối của cú pháp Python (nghĩa là những nơi mà kết quả là khá đáng ngạc nhiên). – 6502

Trả lời

12

Dựa trên python documentation về khai thác được ưu tiên:

Lưu ý rằng so sánh, kiểm tra thành viên, và kiểm tra danh tính, tất cả đều có cùng độ ưu tiên và có một tính năng trái sang phải chaining như mô tả trong So sánh phần.

Vì vậy, thực sự bạn có một tuyên bố bị xích như sau:

>>> (True is False) and (False==False) 
False 

Bạn có thể giả định rằng vật thể trung tâm sẽ được chia sẻ giữa 2 hoạt động và các đối tượng khác (False trong trường hợp này).

Và lưu ý rằng nó cũng đúng đối với tất cả các so sánh, trong đó có các bài kiểm tra thành viên và các hoạt động kiểm tra danh tính mà là toán hạng sau:

in, not in, is, is not, <, <=, >, >=, !=, == 

Ví dụ:

>>> 1 in [1,2] == True 
False 
8

Đây là bất đẳng thức kép được mở rộng thành (True is False) and (False == False). Xem ví dụ What is the operator precedence when writing a double inequality in Python (explicitly in the code, and how can this be overridden for arrays?)

+0

Vì vậy, trong ngắn hạn, đây là một lỗi? Có vẻ như rất trực quan. –

+2

Mặt khác, bạn có thể viết '0 <0,25 <0,5' sẽ cho kết quả lạ ở các ngôn ngữ khác. –

+1

Không, nó không phải là một lỗi - đó là hoạt động dự định của ngôn ngữ gây ngạc nhiên cho bạn – holdenweb

10

Python có thuộc tính chuyển tiếp duy nhất khi nói đến toán tử so sánh. Nó sẽ dễ dàng hơn để xem trong một trường hợp đơn giản hơn.

if 1 < x < 2: 
    # Do something 

Điều này có vẻ như thế nào. Nó sẽ kiểm tra nếu 1 < x và nếu x < 2. Điều tương tự cũng xảy ra trong mã không được mã hóa của bạn.

>>> True is False == False 
False 

Người ta kiểm tra xem Đúng là False False == False, chỉ một trong số đó là sự thật.

+0

Ahhh! Tôi đã sử dụng '1

1

Python độ hoạt động chaining nếu nó gặp các nhà khai thác của cùng một ưu tiên khi đánh giá một biểu thức.

so sánh, trong đó có bài kiểm tra, mà tất cả đều có cùng độ ưu tiên chuỗi từ trái sang phải

Các nhà khai thác dưới đây đề cập có cùng độ ưu tiên.

in, not in, is, is not, <, <=, >, >=, <>, !=, == 

Vì vậy, khi Python cố gắng để đánh giá biểu thức True is False == False, nó gặp các nhà khai thác is== có cùng độ ưu tiên, vì vậy nó thực hiện chaining được kết từ trái sang phải.

Vì vậy, khái niệm True is False == False là thực sự đánh giá là:

(True is False) and (False == False) 

cho False như đầu ra.

2

Python giải thích nhiều (trong) bình đẳng theo cách bạn mong chờ trong Math:

Trong Math a = b = c nghĩa là tất cả a = b, b = ca = c.

Vì vậy True is False == False nghĩa True == FalseFalse == FalseTrue == False, đó là False.

Đối với hằng số boolean, is tương đương với ==.

+0

Thực ra, 'a là b == c' chỉ có nghĩa là' (a là b) và (b == c) ':' a' và 'c' không được so sánh. Xem xét '0.0 == 0 là 0'. – Lynn

+0

@Mauris Tôi có nghĩa là a là b và b là c ngụ ý a là c. Tôi chỉ đưa ra một cách đơn giản để xác định kết quả không phải là cách xử lý của nó – prakharsingh95

Các vấn đề liên quan