2016-07-29 24 views
21

Điều này ngăn cản tôi. Mặc dù không biết thứ tự ưu tiên, người ta có thể kiểm tra xem hai cách có thể để thu thập các biểu hiện sẽ cung cấp cho False:0 là 0 == 0 (#evaluates to True?)

>>> (0 is 0) == 0 
False 
>>> 0 is (0 == 0) 
False 

Nhưng

>>> 0 is 0 == 0 
True 

Tại sao?

+10

Đây phải là một bản dupe, nhưng '0 là 0 == 0' được phân tách thành' (0 là 0) và (0 == 0) ', giống như' a == b == c' được phân tách thành 'a == b và b == c'. –

+0

@PaulHankin Bạn nên để nó như là một asnwer –

+0

Kiểm tra bài đăng này: [Hiểu về toán tử "is" của Python] (http://stackoverflow.com/questions/13650293/understanding-pythons-is-operator) –

Trả lời

5

Khi chuỗi các toán tử so sánh trong Python, toán tử không thực sự được áp dụng cho kết quả của các toán tử khác, nhưng được áp dụng riêng cho toán hạng. Đó là x ? y ?? z (trong đó ??? có nghĩa vụ phải ở trong một số toán tử so sánh) không tương đương với (x ? y) ?? z cũng không phải x ? (y ?? z), mà là x ? y and y ?? z.

Điều này đặc biệt hữu ích cho > và đồng, cho phép bạn viết những thứ như min < x < max và làm điều bạn muốn thay vì so sánh số boolean với số (điều này sẽ xảy ra ở hầu hết các ngôn ngữ khác).

19

Bạn đang sử dụng toán tử so sánh chuỗi. Khái niệm được hiểu là:

(0 is 0) and (0 == 0) 

Từ Comparisons documentation:

So sánh có thể được xích tùy tiện, ví dụ, x < y <= z tương đương với x < y and y <= z, trừ y đó được đánh giá chỉ một lần (nhưng trong cả hai trường hợp z không được đánh giá gì cả khi x < y bị phát hiện là sai).

0 is 0 là đúng bởi vì Python interns small integers, một chi tiết thực hiện, vì vậy bạn sẽ có được (True) and (True) sản xuất True.

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